Java泛型集合的疑问

时间:2011-08-06 12:50:52

标签: java generics collections

我在使用仿制药时遇到了麻烦。我已经定义了以下静态方法:

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);

或者我应该只调用group方法将Number类型指定为:

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

您将无法获得List<Number>

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

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

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

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

此致  斯特凡

答案 1 :(得分:2)

您需要明确指定Number作为类型参数,如您所建议的那样。

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