限制扩展java中的泛型,以任何方式绕过它?

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在抽象控制器的几个方法中使用,我真的想避免覆盖它们.

任何想法都会很好.

use*_*er7 6

你可以改变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)


Eug*_*ene 5

泛型在开始时是不变的,因此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)