我可以在Java中声明以下内容吗?
public class NewIterator<E extends Comparable<? super E>> implements Iterator<E> {
NewIterator(Iterator<? extends E & Comparable<? super E>> iterator){
...
}
我收到错误说
Multiple markers at this line
- Incorrect number of arguments for type Iterator<E>; it cannot be parameterized with arguments <? extends E, Comparable<? super E>>
- Syntax error on token ",", ; expected
- Syntax error on token "&", , expected
- Syntax error on token ")", ; expected
答案 0 :(得分:6)
将您的班级定义为
class NewIterator<E extends Comparable<? super E>> implements Iterator<E> {
你说E
必须实施Comparable<? super E>
。
现在在构造函数中,您尝试重复该操作并允许E的子类型。
NewIterator(Iterator<? extends E & Comparable<? super E>> iterator){
...
}
如果你这样做
public NewIterator(Iterator<? extends E> iterator) {
}
你应该得到你想要的东西,因为E
已经定义了它是一种实现类似接口的类型。
实施例
class IntegerNumber {}
class PositiveNumber extends IntegerNumber implements Comparable<IntegerNumber> {}
class OddPositiveNumber extends PositiveNumber {}
private NewIterator<PositiveNumber> newIterator;
void foo() {
Iterator<PositiveNumber> iterator = createIteratorFrom(
new PositiveNumber(1),
new OddPositiveNumber(7)
);
this.newIterator = new NewIterator(iterator);
}
如果您在PositiveNumber
中使用NewIterator<E extends Comparable<? super E>>
,则可以E
替换PositiveNumber
。所以你的构造函数接受Iterator<? extends PositiveNumber>
。您现在可以在PositiveNumber
的任何子类上创建迭代器,但由于该类继承自PositiveNumber
,因此它还必须继承Comparable<IntegerNumber>
接口。