【发布时间】:2023-03-04 13:54:01
【问题描述】:
以下在 JDK8 中编译得很好,但在 JDK7 中会出现 incompatible types 错误。
List<List<? extends Number>> xs = Arrays.asList(Arrays.asList(0));
根据this answer,List<List<? extends Number>> 与List<List<Integer>> 没有超类型关系。
Java 8 中的哪些变化使这项任务有效?我也很难理解为什么它在 Java 7 中不起作用。
这两个语句都使用 JDK7 编译,没有类型错误:
List<? extends Number> xs = Arrays.asList(0);
List<? extends List<? extends Number>> ys = Arrays.asList(Arrays.asList(0));
在我看来,这两种方法都适用于 JDK7,但上面的原始示例却没有。当然,它们都可以在 JDK8 中工作。我认为要真正了解这里发生了什么,我需要了解为什么这些示例在 Java 7 中是合法的,但原始示例却不是。
【问题讨论】:
-
在我看来,因为
Arrays.asList(0)会返回一个List<Integer>,而Arrays.asList()会返回一个List,其元素是List<Integer>,在我看来,分配@987654331 @ 实际上是对的......不过我几乎肯定会误解一些东西 -
@SotiriosDelimanolis Aaaa 原来我在试验时忘记将线路改回来。我也会失败。
-
@user3580294 - "... 在我看来,分配 List
- > 实际上是正确的..."
-
@DaoWen 我听说 JLS 对 Java 8 中类型推断/检测/检查的工作方式进行了改进,因此规范可能不允许它返回然后。我不能肯定地说。一个很有趣的问题....
-
Java 7 的正确习惯用法是
List<List<? extends Number>> ys = Arrays.<List<? extends Number>asList(Arrays.asList(0));。它表明即使在 Java 7 下,赋值也是正确的,并且只是有限的 type-inference 问题。
标签: java generics java-8 bounded-wildcard