如何处理实现Comparable <!-?->而不是Comparable <e>的类?

时间:2019-05-17 15:04:16

标签: java generics

我创建了一个Iterator包装器,该包装器返回元素,直到达到以下特定阈值为止:

public class MyIterators {
    public static <E extends Comparable<E>> Iterator<E> threshold(final Iterator<? extends E> iterator, final E threshold) {
        ...
    }
}

我想在实用程序函数中将其用于Iterator<ChronoZonedDateTime>,如下所示:

public static Iterator<ZonedDateTime> oneYear(final Iterator<ZonedDateTime> iterator) {
    return MyIterators.threshold(iterator, ZonedDateTime.now().plusYears(1));
}

我得到:

method threshold in class MyIterators cannot be applied to given types;
[ERROR]   required: java.util.Iterator<? extends E>,E
[ERROR]   found: java.util.Iterator<java.time.chrono.ChronoZonedDateTime>,java.time.ZonedDateTime
[ERROR]   reason: cannot infer type-variable(s) E
[ERROR]     (argument mismatch; java.util.Iterator<java.time.chrono.ChronoZonedDateTime> cannot be converted to java.util.Iterator<? extends java.time.chrono.ChronoZonedDateTime<?>>)

编译器将推断ChronoZonedDateTime而不是ZonedDateTime,而我根本没有声明/使用该类。

我该如何应对?我要引入手动转换,还是有一种以类型安全的方式完成所有这些转换的方法?

我正在使用JDK 8.x。

1 个答案:

答案 0 :(得分:2)

我认为问题是由原始类型ChronoZonedDateTime引起的。如果为通用类型ChronoZonedDateTime<?>指定通配符,则代码将编译并运行:

final Iterator<ChronoZonedDateTime<?>> iterator = null;
MyIterators.threshold(iterator, ZonedDateTime.now().plusYears(1));

请参阅:What is a raw type and why shouldn't we use it?


在OP上编辑此答案会从问题中删除一些信息。

关于第二个问题,应在<E extends Comparable<E>>的签名中将<E extends Comparable<? super E>>更改为threshold,这将允许您传递通用类型为一个的Iterator对象与其父类型进行比较。

新方法签名应如下所示:

public static <E extends Comparable<? super E>> Iterator<E> threshold(final Iterator<? extends E> iterator, final E threshold) {