我在使用仿制药时遇到了麻烦。我已经定义了以下静态方法:
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);
提前致谢。
答案 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);