Java 泛型 - 编译错误

标签 java generics

为什么不起作用?

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/

相关文章:

java - 在 Java 上格式化日期

java - 对 double 使用模时性能会下降

java - 为什么编译器不给 List l = new LinkedList<String>() 错误或警告

如果嵌套方法参数不是类型安全的,Java 泛型会推断嵌套方法调用的对象而不是 T

java - 根据某些字段的值从 ArrayList 中选择对象

java - jframe 父级中的 Jpanel 火灾事件

java - 浏览器下载完成事件

java泛型协方差

java - 在运行时获取类的泛型类型

java - 解析回调 URL 中参数的最佳方法