我现在有以下类层次结构:
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>();
也可以吗? 有没有任何演员阵容的干净方式? (允许使用通配符)
谢谢!
答案 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