为什么不起作用?
class W<A extends Number>
{
public void create(A value)
{
}
}
public void calculate(W<? extends Number> w)
{
Integer v = 5;
w.create(v); // Compilation error
}
有人可以解释一下该代码有什么问题以及如何修复它吗?
编译错误:“W 中的创建(捕获)无法应用于 (java.lang.Integer)”
最佳答案
您对泛型中的通配符有一个常见的误解。您认为?
意味着您可以传递任何类型(只要它扩展 Number
),但您不能。
? extends Number
并不意味着您可以传递任何扩展 Number
的类型。它的意思是“扩展 Number
的特定但未知的类型”。由于编译器不知道确切的类型,因此它不能允许您使用 Integer
- 此时编译器根本没有足够的信息来检查它是否是类型安全的。 (它不知道您传递给该方法的 W
的实际类型是 Integer
还是扩展 Number
的其他类型)。
这与无法向 List<?>
添加任何内容的原因完全相同。 ,例如,这是人们经常问的问题。
关于Java 泛型 - 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42713199/