我创建了一个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。
答案 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) {