我可以覆盖通用 class 的 setter 功能吗?
Can I override setter function of generic class?
我在通用 class Jet 中继承了通用 class 车辆,还有两个名为 T4 和 T5 的变量。在覆盖父 class 的 setName(T )
函数时,我收到一条错误消息 Error:(27, 17) java: name clash: setName(T1) in Jet and setName(T1) in Vehicle have the same erasure, yet neither overrides the other
class Vehicle <T1,T2,T3 extends Number>{
private T1 name;
private T2 company;
private T3 price;
public void setName(T1 name){
this.name=name;
}
public void setCompany(T2 company){
this.company=company;
}
public void setPrice(T3 price){
this.price=price;
}
public T1 getName(){
return name;
}
public T2 getCompany(){
return company;
}
public T3 getPrice(){
return price;
}
}
class Jet <T5,T2,T3,T4> extends Vehicle{
T4 jetEngine;
T5 name;
public void setName(T5 name){ //causing an error here
this.name = name;
System.out.println("Yeah you can do that");
}
public void setJetEngine(T4 jetEngine){
this.jetEngine=jetEngine;
}
public T4 getJetEngine(){
return jetEngine;
}
}
您正在将 Vehicle 作为原始类型进行扩展。所以 setName() 不会将 T5 作为参数。如果你想用 setName(T5) 覆盖 setName(T1) 你应该做类似
class Jet<T5, T2, T3 extends Number, T4> extends Vehicle<T5, T2, T3> {
....
public void setName(T5 name) {
// this should work now
}
....
}
如果您不将通用参数 T1、T2、T3 也传递给父 class,则它们对父 class 没有任何意义。它们将被简单地视为原始类型,java 期望它们都是 Object
.
我在通用 class Jet 中继承了通用 class 车辆,还有两个名为 T4 和 T5 的变量。在覆盖父 class 的 setName(T )
函数时,我收到一条错误消息 Error:(27, 17) java: name clash: setName(T1) in Jet and setName(T1) in Vehicle have the same erasure, yet neither overrides the other
class Vehicle <T1,T2,T3 extends Number>{
private T1 name;
private T2 company;
private T3 price;
public void setName(T1 name){
this.name=name;
}
public void setCompany(T2 company){
this.company=company;
}
public void setPrice(T3 price){
this.price=price;
}
public T1 getName(){
return name;
}
public T2 getCompany(){
return company;
}
public T3 getPrice(){
return price;
}
}
class Jet <T5,T2,T3,T4> extends Vehicle{
T4 jetEngine;
T5 name;
public void setName(T5 name){ //causing an error here
this.name = name;
System.out.println("Yeah you can do that");
}
public void setJetEngine(T4 jetEngine){
this.jetEngine=jetEngine;
}
public T4 getJetEngine(){
return jetEngine;
}
}
您正在将 Vehicle 作为原始类型进行扩展。所以 setName() 不会将 T5 作为参数。如果你想用 setName(T5) 覆盖 setName(T1) 你应该做类似
class Jet<T5, T2, T3 extends Number, T4> extends Vehicle<T5, T2, T3> {
....
public void setName(T5 name) {
// this should work now
}
....
}
如果您不将通用参数 T1、T2、T3 也传递给父 class,则它们对父 class 没有任何意义。它们将被简单地视为原始类型,java 期望它们都是 Object
.