声明迭代器<! - ?延伸E&Comparable <?超级E - >&gt; java中的迭代器

时间:2013-08-04 18:15:44

标签: java

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

1 个答案:

答案 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>接口。