Why am I getting an AssertionError when assigning Arrays.asList() to var directly?

tonyhoan :

I'm trying to understand local variable type inference in Java 10.

  1. The code below works perfectly during compilation and runtime:

    List list1 = Arrays.asList(1L, 2.0F, "3");
    var list2 = list1;
    
  2. 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.

ZhekaKozlov :

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:

  1. Do not use the -g flag
    • If you use IDEA: Settings → Build, Execution, Deployment → Compiler → Java Compiler → Uncheck "Generate Debugging Info"
  2. 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");
  3. Use Eclipse which has its own compiler

UDPATE:

The bug was fixed in JDK 10.0.2.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=425487&siteId=1