【发布时间】:2014-05-01 17:14:57
【问题描述】:
此代码已从更复杂的类结构中尽可能地简化。在实际代码中,我在这里使用了 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("unchecked") 够用吗?
-
我忘了说,我编辑了这篇文章,将泛型放在代码块中的错误消息中,这样你就可以看到正在使用的泛型类型。
-
感谢您编辑帖子。
-
附注压制警告是作弊,因为我希望有一个优雅的解决方案,对不起!
标签: java generics type-parameter