具有泛型的Java接口应接受子类作为类型参数

时间:2016-11-28 15:35:13

标签: java generics inheritance interface generic-type-argument

我现在有以下类层次结构:

interface Interface<T> {
    boolean isGreaterThan(T other);
}
class Base implements Interface<Base> {
    public boolean isGreaterThan(Base other) {
        return true;
    }
}
class Subclass extends Base {
    ... //note that I dont need to implement or overwrite isGreaterThan() here
}
class Wrapper<E extends Interface<E>> {
    protected List<E> list;
    ...
}
class Test {
    public static void main(String[] args) {
        Wrapper<Subclass> = new Wrapper<Subclass>(); //This line produces the error
    }
}

我收到以下错误消息:

Type parameter 'Subclass' is not within its bound; should implement 'Interface<Subclass>'

我的问题是:我如何告诉java,接口应该接受任何扩展T的元素E?或者是Wrapper的原因?我尝试了Wrapper:

class Wrapper<E extends Interface<? extends E>> {}

它在包装体中产生了错误,并没有改变原始错误。

Wrapper<Base> wrapper = new Wrapper<Base>();

工作得很好...... 我怎么做

Wrapper<Subclass> wrapper = new Wrapper<Subclass>();

也可以吗? 有没有任何演员阵容的干净方式? (允许使用通配符)

谢谢!

2 个答案:

答案 0 :(得分:2)

做这样的事情:

class Base<T extends Base<T>> implements Interface<T> {
    public boolean isGreaterThan(T other) {
        return true;
    }
}

class Subclass extends Base<Subclass> {
    ... //note that I dont need to implement or overwrite isGreaterThan() here
}

答案 1 :(得分:2)

尝试

class Wrapper<E extends Interface<? super E>>

就像Comparable一样,它直观地为'contra-variant'类型,因此在大多数情况下,它应与<? super>一起使用。例如Collections.sort