【问题标题】:Java generics and inheritanceJava 泛型和继承
【发布时间】:2011-03-06 22:49:34
【问题描述】:

我有以下抽象类:

public abstract class AbSuperClass1<K,S> {
    //class definition
}

和:

public abstract class AbSuperClass2<K,S> {
    public abstract <Q extends AbSuperClass1<K,S>> void method(Q arg);
    ...
}

然后我有两个具体的实现

public class Concrete1 extends AbSuperClass<String, String>{
    //class definition
}

和:

public class Concrete2 extends AbSuperClass2<String, String>{
    public void method(Concrete1 arg){
        //method definition
    }
}

然而,这不会编译,因为 Concrete1 不被识别为 Concrete2 中方法参数的有效类型,但据我所知,Concrete1 是正确的类型,因为它扩展了 AbSuperClass1。

我哪里错了?

【问题讨论】:

  • 如果可能,我建议使用 Eclipse 作为编写 Java 代码的环境。Eclipse 会准确地向您显示错误所在,并提供一个下拉菜单供您使用鼠标添加缺少的功能点击。这种能力可以显着加快您的学习曲线和开发时间。
  • public abstract &lt;Q extends AbSuperClass1&lt;K,S&gt;&gt; void method(Q arg); 相当于public abstract void method(AbSuperClass1&lt;K,S&gt; arg);。

标签: java generics inheritance oop


【解决方案1】:

Eclipse 建议添加这个方法:

@Override
public <Q extends AbSuperClass1<String, String>> void method(Q arg) {
    // TODO Auto-generated method stub

}

您可以做的另一件事是将此类型参数添加到类中:

abstract class AbSuperClass2<K,S, Q extends AbSuperClass1<K,S>> {
    public abstract void method(Q arg);
}

和

class Concrete2 extends AbSuperClass2<String, String, Concrete1> {
    public void method(Concrete1 arg) {
        //method definition
    }
}

【讨论】:

    【解决方案2】:

    考虑这个程序:

    public class OtherConcrete extends AbSuperClass<String, String> {}
    
    AbSuperClass2<String, String> x = new Concrete2();
    x.method(new OtherConcrete());
    

    你希望它做什么?在为AbSuperClass&lt;String, String&gt; 的一个特定子类型 提供实现方面,您已经覆盖了方法 - 但您还没有提供可以处理 any AbSuperClass&lt;String, String&gt; 的实现,这是必需的。

    在不了解具体情况的情况下很难提出特定的行动方案。 Bozho 关于添加另一个类型参数的建议——允许您使method 声明更具体——是一个很好的建议……但整个事情变得非常复杂。如果您能想出任何方法来减少泛型时髦的数量,您的代码维护人员可能会感谢您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      相关资源
      最近更新 更多