我需要写一个方法,它以一个List作为输入,它的元素都是继承自Number的类型,并返回这个集合的元素之和。
public static <T> Number test(List<? extends Number> myList)
{
Number result = 0;
for (var element:
myList)
{
result += element;
}
return result;
}
问题是上线了
result += element;
编译器抛出错误
Operator '+' cannot be applied to 'java.lang.Number', 'capture<? extends java.lang.Number>'
你怎么能绕过它?
在这种情况下,问题不在泛型中。在这种情况下编写它并不难:
问题是 Number 是一个抽象类。想象一个情况。
Number x = 3,5;
// Java 实际上创建了一个 Double 类型的对象,它继承自 Number(框内的 double)Number y = 4;
// 这里也一样,只创建 Integer (int in box)现在我们这样做:
Number z = x + y;
在这种情况下,对于Java,所有这些变量都是抽象类Number的类型,其中提供了不同的方法来提取不同类型的数据(您可以通过查看排序来验证这一点)。然后出现了一个公平的问题:应该自动调用哪个方法来执行这个数学运算,因为这些方法有很多,并且问题的正确答案分别取决于转换为 Number 的数据类型,对此一无所知(请不要与多态混淆,其中不同的后代有一个超类方法被覆盖,那么方法的签名必须匹配!)。
所以答案是这样的: