在Java中声明Iterator<? extends E & Comparable<? super E>>的含义

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

1
编译器正在将您拒之门外……所以我的回答是“不行”。您能更详细地说明为什么需要以这种方式进行泛型化,或者说,您试图执行的泛型化是什么? - Makoto
4
请使用 Iterator<? extends E> - Luiggi Mendoza
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);
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接