[英]Java generics and inheritance
我有以下抽象类:
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。
我哪里错了?
考虑这个程序:
public class OtherConcrete extends AbSuperClass<String, String> {}
AbSuperClass2<String, String> x = new Concrete2();
x.method(new OtherConcrete());
你期望做什么? 您已经在为AbSuperClass<String, String>
一个特定子类型提供实现方面覆盖了方法 - 但是您没有提供可以处理任何 AbSuperClass<String, String>
,这是必需的。
在不了解情况细节的情况下,很难提出具体的行动方案。 Bozho建议添加另一个类型参数 - 允许你使method
声明更具体 - 是一个很好的...但整个过程变得非常复杂。 如果你可以通过任何方式减少通用funkiness的数量,你的代码维护者可能会感谢你。
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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.