Подтвердить что ты не робот

Почему я получаю AssertionError при назначении Arrays.asList() для var напрямую?

Я пытаюсь понять вывод локального переменного типа в Java 10.

  1. Код ниже отлично работает во время компиляции и времени выполнения:

    List list1 = Arrays.asList(1L, 2.0F, "3");
    var list2 = list1;
    
  2. Однако эта строка генерирует ошибку компиляции:

    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<?>>

Я не совсем понимаю, почему второй случай ошибочен, но не первый случай. Поскольку я ожидаю, что компилятор выводит тип list1 и обрабатывает list2 и list3 одинаково. Заранее спасибо.

4b9b3361

Ответ 1

Это ошибка в компиляторе Java 10: https://bugs.openjdk.java.net/browse/JDK-8199910

Он воспроизводится только при вызове javac с флагом -g.

Возможные обходные пути:

  1. Не используйте флаг -g
    • Если вы используете IDEA: Настройки → Сборка, выполнение, развертывание → Компилятор → Компилятор Java → Снимите флажок "Генерировать информацию отладки"
  2. Не используйте var с типами пересечений (используйте явные типы):
    • List<Object> list = Arrays.asList(1L, 2.0F, "3");
    • var list = Arrays.<Object> asList(1L, 2.0F, "3");
  3. Используйте Eclipse, у которого есть свой собственный компилятор

UDPATE:

Ошибка была исправлена в JDK 10.0.2.

Ответ 2

Это ошибка openjdk, см. Это:

Javac должен пропускать недентифицируемые типы в атрибуте LocalVariableTypeTable