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

时间:2009-10-26 22:01:27

标签: java

我有以下情况:

abstract class X { abstract X someMethod (...) {...} }.

现在我想约束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

是否可以使用Java泛型实现此目的?

修改

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

5 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:4)

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

    abstract I someMethod();
}

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

答案 2 :(得分:2)

这是一种允许您返回this的参数类型的方法:

AbstractFoo<T extends AbstractFoo<T>> {
  /** Subclasses must implement to return {@code this}. */
  protected abstract T getThis();

  /**  Does something interesting and returns this Foo */
  public T inheritedThing {
    /* blah di blah */
    return getThis();
  }
} 

答案 3 :(得分:1)

是。这是return type covariance

答案 4 :(得分:0)

这应该可以正常工作:

class X<T> {
  abstract T someMethod(...);
}

class X1<T1> extends X
  T1 someMethod(...) {
    ...
  }
}