2011-08-06 144 views
3

我遇到了泛型的问题。我定义了下面的静态方法:Java泛型集合怀疑

public static <E extends Number> List<E> group(E ... numbers) { 
    return Arrays.asList(numbers); 
} 

我明白为什么这个工程:

List<Integer> ints = group(1, 2, 3); 

但是我有我的方法签名更改为使这项工作:

List<Number> ints = group(1, 2, 3); 

或者我应该只是将指定数字类型的组方法称为:

List<Number> ints = MyClass.<Number>group(1, 2, 3); 

在此先感谢。

回答

2

您需要明确指定Number作为类型参数,因为你建议。

List<Number> ints = MyClass.<Number>group(1, 2, 3); 
+3

另一个选择是使用'List <?扩展Number> ints = ...;' – Jeremy

2

您将无法获得List<Number>

如果您的方法group(1,2,3)返回List<Integer>,并且您表示该工作,那么此表达式的类型为List<Integer>

List<Integer>不是 a List<Number>。继承意味着专业化,所以如果你的List<Integer>是一种List<Number>,你可以添加Double到你的List<Integer>(因为超类可以这样做,子类也可以)。这是错误的。 这不是铸造问题,它只是推迟你的编译问题到运行时。这个问题对于人类来说是合乎逻辑和相当矛盾的,但这就是收集和继承的工作方式。

所以,如果你真的想要得到一个List<Number>我建议你定义第二个方法:

public static List<Number> groupAsNumbers(Number ... numbers) { 
    return Arrays.asList(numbers); 
} 

问候, 斯特凡

+0

只是要清楚,在Java'名单'不延长'名单'。如果你的方法返回'List ',那么使用'Number'作为变量类型的正确方法是'List <?扩展Number>'',它告诉编译器你真的*想要一个以'Number'为基数的项目列表,而不仅仅是静态类型为Number的实例。 – Jeremy

+0

感谢您的完成。 @杰勒米海勒。你是对的List <?扩展Number>是两个列表的超类型。 – Snicolas