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@杰里米·海勒。你说得对