Java泛型和继承

Tom*_*Tom 9 java oop generics inheritance

我有以下抽象类:

public abstract class AbSuperClass1<K,S> {
    //class definition
}
Run Code Online (Sandbox Code Playgroud)

和:

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

然后我有两个具体的实现

public class Concrete1 extends AbSuperClass<String, String>{
    //class definition
}
Run Code Online (Sandbox Code Playgroud)

和:

public class Concrete2 extends AbSuperClass2<String, String>{
    public void method(Concrete1 arg){
        //method definition
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我哪里错了?

Jon*_*eet 5

考虑这个程序:

public class OtherConcrete extends AbSuperClass<String, String> {}

AbSuperClass2<String, String> x = new Concrete2();
x.method(new OtherConcrete());
Run Code Online (Sandbox Code Playgroud)

你期望做什么?你覆盖的方法提供了实现的条件一个特定亚型AbSuperClass<String, String>-但你没有提供能够应付实现任何 AbSuperClass<String, String>,这是真实需要什么.

在不了解情况细节的情况下,很难提出具体的行动方案.Bozho建议添加另一个类型参数 - 允许你使method声明更具体 - 是一个很好的...但整个过程变得非常复杂.如果你可以通过任何方式减少通用funkiness的数量,你的代码维护者可能会感谢你.


Boz*_*zho 4

Eclipse 建议添加此方法:

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

class Concrete2 extends AbSuperClass2<String, String, Concrete1> {
    public void method(Concrete1 arg) {
        //method definition
    }
}
Run Code Online (Sandbox Code Playgroud)