让我们看一下这些声明:
ArrayList<String> list = new ArrayList<String>() {{add("hi");}};
System.out.println(list.get(0));
和
var list = new ArrayList<String>() {{add("hi");}};
System.out.println(list.get(0));
由于类型推断,两者相同。但是我也很震惊地看到它们也可以编译:
var<String> list = new ArrayList<String>() {{add("hi");}};
System.out.println(list.get(0));
和
var<Integer> list = new ArrayList<String>() {{add("hi");}};
System.out.println(list.get(0));
所有上述方法都会生成相同的字节码。我原以为var<T>
会失败,但不会失败。我在JLS和JVMS中进行了搜索,但未发现与此行为相关的任何信息。
为什么Java认为var<T>
有效?向后兼容吗?
编辑:查看评论。