Java泛型集合

Java泛型集合,java,generics,collections,Java,Generics,Collections,我在使用仿制药方面遇到了麻烦。我定义了以下静态方法: public static <E extends Number> List<E> group(E ... numbers) { return Arrays.asList(numbers); } 公共静态列表组(E…编号){ 返回数组.asList(数字); } 我明白这是为什么: List<Integer> ints = group(1, 2, 3); List ints=组(1,2,3);

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

public static <E extends Number> List<E> group(E ... numbers) {
    return Arrays.asList(numbers);
}
公共静态列表组(E…编号){
返回数组.asList(数字);
}
我明白这是为什么:

List<Integer> ints = group(1, 2, 3);
List ints=组(1,2,3);
但我必须在方法签名中更改什么才能使其生效:

List<Number> ints = group(1, 2, 3);
List ints=组(1,2,3);
或者我应该调用group方法,将数字类型指定为:

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

提前感谢。

您将无法获得
列表

如果您的方法
组(1,2,3)
返回一个
列表
,并且您说该方法有效,那么该表达式属于
列表
类型

而且
列表
不是
列表
。继承意味着专门化,因此如果您的
列表
将是一种
列表
,您可以向
列表
中添加
s(因为超类可以这样做,子类也可以这样做)。这是错误的。 这不是强制转换问题,它只是将编译问题推迟到运行时。这个问题是合乎逻辑的,对人类来说是一个相当矛盾的问题,但这就是收集和继承的工作方式

因此,如果您真的想获得
列表
,我建议您定义第二种方法:

public static List<Number> groupAsNumbers(Number ... numbers) {
    return Arrays.asList(numbers);
}
公共静态列表GroupAsNumber(数字…数字){
返回数组.asList(数字);
}
问候,,
Stéphane

您需要按照您的建议明确指定
Number
作为类型参数

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

另一个选项是使用
列表,只是为了清楚起见,在Java中
列表
不扩展
列表
。如果您的方法返回
List
,那么使用
Number
作为变量类型的正确方法是
listforcompletion@杰里米·海勒。你说得对