Gon*_*lvo 8 java generics inheritance
我有以下模型在我的应用程序中制作控制器.显然,完整的模型更复杂,但我会专注于导致我出现问题的唯一部分:
public abstract AbstractController<T> {
abstract protected Class<T> getType();
}
public ParentController extends AbstractController<Parent> {
@Override
protected Class<Parent> getType() {
return Parent.class;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想扩展Parent对象并为子有一个控制器,它看起来像这样:
public SonController extends ParentController {
@Override
protected Class<Son> getType() {
return Son.class;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是getType()方法在编译时显示不兼容(期望类Parent).
我尝试使用泛型,但我找不到解决方案.方法getType在抽象控制器的几个方法中使用,我真的想避免覆盖它们.
任何想法都会很好.
你可以改变getType回报Class<? extends T>.
abstract protected Class<? extends T> getType();
Run Code Online (Sandbox Code Playgroud)
然后ParentController,SonController看起来像
public class ParentController extends AbstractController<Parent> {
@Override
protected Class<? extends Parent> getType() {
return Parent.class;
}
}
public class SonController extends ParentController {
@Override
protected Class<? extends Parent> getType() {
return Son.class;
}
}
Run Code Online (Sandbox Code Playgroud)
泛型在开始时是不变的,因此Class<Son>无法分配Class<Parent>(在您的情况下,这些不是协变返回类型).
但是带有扩展边界(上限)的通配符使得类型协变,因此这将解决它:
public abstract class AbstractController<T> {
abstract protected Class<? extends T> getType();
}
public class ParentController extends AbstractController<Parent> {
@Override
protected Class<? extends Parent> getType() {
return Parent.class;
}
}
class SonController extends ParentController {
@Override
protected Class<? extends Parent> getType() {
return Son.class;
}
}
Run Code Online (Sandbox Code Playgroud)