此代码已从更复杂的类结构中尽可能地简化。在实际代码中,有我在这里使用的 Integer 和 Double 类型的子类型。
我正在尝试将 Java 泛型与类型参数一起使用。如果用户请求 Number.class
的类型,我们想合并 List<Integer>
列表和 List<Double>
将列表合并为一个列表。
虽然代码有效,但我无法摆脱未经检查的强制转换警告(请参阅 TODO 标记)。警告是:
Type safety: Unchecked cast from List<Integer> to Collection<? extends T>
但是,如果我删除强制转换,则会出现编译错误:
The method addAll(Collection<? extends T>) in the type List<T> is not applicable for the arguments (List<Integer>).
我的代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class Generics1 {
static final List<Integer> intList = new ArrayList<Integer>(Arrays.asList(
1, 2, 3, 4));
static final List<Double> dblList = new ArrayList<Double>(Arrays.asList(
1.1, 2.2, 3.3));
public static <T extends Number> List<T> getObjects(Class<T> type) {
List<T> outList = new ArrayList<T>();
if (type == Number.class) {
// user asked for everything
// TODO: unchecked cast warnings here should be fixed
outList.addAll((Collection<? extends T>) intList);
outList.addAll((Collection<? extends T>) dblList);
} else {
// user asked for subtype of number
if (Integer.class.isAssignableFrom(type)) for (Integer i : intList)
if (type.isInstance(i)) {
T obj = type.cast(i);
outList.add(obj);
}
if (Double.class.isAssignableFrom(type)) for (Double d : dblList)
if (type.isInstance(d)) {
T obj = type.cast(d);
outList.add(obj);
}
}
return outList;
}
public static void main(String[] args) {
System.out.println("HI!");
System.out.println("integers: " + getObjects(Integer.class));
System.out.println("doubles: " + getObjects(Double.class));
System.out.println("numbers: " + getObjects(Number.class));
}
}
最佳答案
您可以将此添加到您的代码中:
@SuppressWarnings("未检查")
这是另一篇解释“什么”含义的 SO 帖子:What is SuppressWarnings ("unchecked") in Java?
这是另一个处理可能有用的链接转换的方法:How do I fix "The expression of type List needs unchecked conversion...'?
尽管通过一些重新编码,您可能会使警告完全消失并且不需要被抑制。
关于java - 使用 Java 泛型、类型参数和返回列表的未经检查的强制转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3790046/