【问题标题】:Can I override setter function of generic class?我可以覆盖泛型类的 setter 函数吗?
【发布时间】:2021-05-21 01:14:51
【问题描述】:

我在泛型类 Jet 中继承泛型类 Vehicle,另外还有两个变量名为 T4 和 T5。在覆盖父类的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 扩展为原始类型。你的意思是像extends Vehicle&lt;T5, T2, T3&gt; 这样的东西吗?
  • 是的,我想用 T5 和 setName(T5 obj) 更改 T1
  • 如果这是您的意图,请编辑您的问题以解决该问题。

标签: java generics inheritance overriding


【解决方案1】:

您将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 也传递给父类,则它们对父类没有任何意义。它们只会被视为原始类型,java 会期望它们都是 Object。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多