简体   繁体   中英

declaring Iterator<? extends E & Comparable<? super E>> iterator in java

Can I declare the following in Java?

public class NewIterator<E extends Comparable<? super E>> implements Iterator<E> {
    NewIterator(Iterator<? extends E & Comparable<? super E>> iterator){
        ...
    }

I am getting an error saying

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

By defining your class as

class NewIterator<E extends Comparable<? super E>> implements Iterator<E> {

you say that E has to implement Comparable<? super E> Comparable<? super E> .

Now in the constructor you try to repeat that and allow subtypes of E.

NewIterator(Iterator<? extends E & Comparable<? super E>> iterator){
    ...
}

If you do just

public NewIterator(Iterator<? extends E> iterator) {

}

You should get what you want because E already defines that it's a type that implements the comparable interface.

Example

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

If you use PositiveNumber in NewIterator<E extends Comparable<? super E>> NewIterator<E extends Comparable<? super E>> you can replace E by PositiveNumber . So your constructor accepts Iterator<? extends PositiveNumber> Iterator<? extends PositiveNumber> . You can now create an iterator over any subclass of PositiveNumber but since that class inherits from PositiveNumber it must also inherit the Comparable<IntegerNumber> interface.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM