Java泛型实现抽象方法的返回类型

Erw*_*out 11 java

我有以下情况:

abstract class X { abstract X someMethod (...) {...} }.
Run Code Online (Sandbox Code Playgroud)

现在我想约束X的任何实现,让它的'someMethod'方法返回特定的实现类型,而不仅仅是X:

class X1 extends X { X1 someMethod (...) {...} }.
class X1 extends X { X someMethod (...) {...} }.  //want this to be flagged as an error
class X2 extends X { X1 someMethod (...) {...} }.  //want this to be flagged as an error too
Run Code Online (Sandbox Code Playgroud)

是否有可能使用Java泛型实现这一点?

编辑

好的.我只问了是/否问题并得到了"是".我的错.我真正感兴趣的是"我如何编写声明".

Bjö*_*örn 18

这也有效;

abstract class X<T> {
    public abstract T yourMethod();
}
class X1 extends X<X1> {
    public X1 yourMethod() {
        return this;
    }
}
class X2 extends X<X2> {
    public X2 yourMethod() {
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是非常丑陋的代码,但它也是我所知道的唯一解决方案,而且我自己使用它... ... (5认同)
  • 尝试使用“abstract class X&lt;T extends X&gt; {}”来强制返回类型。 (2认同)

mer*_*ike 5

abstract class X<I extends X<I>> {
    protected X(Class<I> implClazz) {
        if (!getClass().equals(implClazz)) {
            throw new IllegalArgumentException();
        }
    }

    abstract I someMethod();
}
Run Code Online (Sandbox Code Playgroud)

基本原理:您不能在类型边界中引用动态类型,因此需要在构造函数中进行间接检查。