I'm trying to understand local variable type inference in Java 10.
The code below works perfectly during compilation and runtime:
List list1 = Arrays.asList(1L, 2.0F, "3"); var list2 = list1;
However, this line throws a compilation error:
var list3 = Arrays.asList(1L, 2.0F, "3");
Error:java: java.lang.AssertionError: Unexpected intersection type: java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>
I don't really understand why the 2nd case is wrong but not the 1st case. Because I expect the compiler would infer the type of list1
and treat list2
and list3
the same. Thanks in advance.
This is a bug in Java 10 compiler: https://bugs.openjdk.java.net/browse/JDK-8199910
It is only reproduced when javac
is called with a -g
flag.
Possible workarounds:
- Do not use the
-g
flag- If you use IDEA: Settings → Build, Execution, Deployment → Compiler → Java Compiler → Uncheck "Generate Debugging Info"
- Do not use
var
with intersection types (use explicit types):List<Object> list = Arrays.asList(1L, 2.0F, "3");
var list = Arrays.<Object> asList(1L, 2.0F, "3");
- Use Eclipse which has its own compiler
UDPATE:
The bug was fixed in JDK 10.0.2.