我有两个扩展公共基类的类。基类具有代码,对于一个具体的子类,需要知道另一个具体子类的Class
。因此,在Foo
和Bar
延长Base
的情况下,Foo
的实例需要知道Bar.class
,而Bar
的实例需要知道Foo.class
。
而且,愚蠢的我,我正在尝试做正确的事情并使用Java泛型来确保子类返回一个有效的Java类对象,扩展基类。
所以,我试过这个:
class Base {
abstract protected <T extends Base> Class<T> getOtherClass();
}
编译器似乎对这种结构感到满意。问题出现在实现中。
首先,我试过了:
class Foo extends Base {
@Override
protected <T extends Base> Class<T> getOtherClass() {
return Bar.class;
}
}
(Bar
也扩展Base
)
抱怨我的返回值类型不匹配,需要强制转换。
然后,我试过了:
class Foo extends Base {
@Override
protected Class<Bar> getOtherClass() {
return Bar.class;
}
}
现在编译器抱怨需要在Class<Bar>
进行演员表。
然后我尝试了:
class Foo extends Base {
@Override
protected Class<Base> getOtherClass() {
return Bar.class;
}
}
现在我得到了两个投诉:需要在Class<Base>
和中投放返回值。
有没有一种表达方式可以避免任何演员阵容?
答案 0 :(得分:6)
abstract class Base<T extends Base> {
abstract Class<T> getOtherClass();
}
class Foo extends Base<Bar> {
@Override Class<Bar> getOtherClass() { return Bar.class; }
}
...或...
abstract class Base {
abstract Class<? extends Base> getOtherClass();
}
class Foo extends Base {
@Override Class<Bar> getOtherClass() { return Bar.class; }
}