4

我可以在 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
4

1 回答 1

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);
}

如果你使用PositiveNumberinNewIterator<E extends Comparable<? super E>>你可以替换EPositiveNumber. 所以你的构造函数接受Iterator<? extends PositiveNumber>. 您现在可以在任何子类上创建迭代器,PositiveNumber但由于该类继承自PositiveNumber它也必须继承Comparable<IntegerNumber>接口。

于 2013-08-04T18:26:11.253 回答