【发布时间】:2019-12-18 08:02:19
【问题描述】:
我正在编写自定义迭代器,但在我的 Java 代码中看到不同的警告。
这是我的代码:
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class CustomIterator<E> implements Iterator<E> {
public static void main(String[] args) {
List<String> a = Arrays.asList("alpha", "beta", "gamma");
List<Integer> b = Arrays.asList(1, 2, 3);
// Type safety: The constructor CustomIterator(Iterator...) belongs to the raw type CustomIterator. References to generic type CustomIterator<E> should be parameterized
CustomIterator it = new CustomIterator(a.iterator(), b.iterator());
// some logic
}
// Type safety: Potential heap pollution via varargs parameter iterators
public CustomIterator(Iterator<E>... iterators) {
// some logic
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return false;
}
@Override
public E next() {
// TODO Auto-generated method stub
return null;
}
}
我刚刚在上面的代码中将警告添加为 cmets。
它发生在两个地方:
// Type safety: The constructor CustomIterator(Iterator...) belongs to the raw type CustomIterator. References to generic type CustomIterator<E> should be parameterized
CustomIterator it = new CustomIterator(a.iterator(), b.iterator());
还有这里:
// Type safety: Potential heap pollution via varargs parameter iterators
public CustomIterator(Iterator<E>... iterators) {
// some logic
}
我可以使用@SuppressWarnings({ "unchecked", "rawtypes" }) 来压制它们,但我想知道为什么我会得到这些以及如何在不压制的情况下避免它们。
【问题讨论】:
-
你可能无法避免压制它们。你正在做的事情有真正的类型安全问题。实际上没有类型
E可以安全地实例化它...除了Object。换句话说,在这里使用泛型并没有任何好处。 -
你需要像
@SafeVarargs public CustomIterator(Iterator<? extends E>... iterators)这样的声明