28 votes

Pourquoi est-ce que j'obtiens une AssertionError lors de l'attribution directe de Arrays.asList () à var?

J'essaie de comprendre variable locale de l'inférence de type en Java 10.

  1. Le code ci-dessous fonctionne parfaitement lors de la compilation et de l'exécution:

    List list1 = Arrays.asList(1L, 2.0F, "3");
    var list2 = list1;
    
  2. Cependant, cette ligne renvoie une erreur de compilation:

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

Je ne comprends vraiment pas pourquoi le 2ème cas est mal, mais pas le 1er cas. Parce que je suppose que le compilateur aurait déduire le type d' list1 et de traiter list2 et list3 le même. Merci à l'avance.

24voto

orionll Points 1045

C'est un bug de Java 10 compilateur: https://bugs.openjdk.java.net/browse/JDK-8199910

Il n'est reproduit lors de l' javac est appelée avec un -g drapeau.

Les solutions possibles:

  1. Ne pas utiliser l' -gdrapeau
    • Si vous utilisez IDÉE: Paramètres → Construire, l'Exécution, le Déploiement → Compilateur → Compilateur Java → Décocher la case "Générer les informations de Débogage"
  2. Ne pas utiliser var avec intersection types (utiliser explicitement les types):
    • List<Object> list = Arrays.asList(1L, 2.0F, "3");
    • var list = Arrays.<Object> asList(1L, 2.0F, "3");
  3. Utiliser Eclipse qui dispose de son propre compilateur

UDPATE:

Le bug a été corrigé dans le JDK 10.0.2.

12voto

孙兴斌 Points 16124

Ceci est un bug de openjdk, voyez ceci :

Javac doit ignorer les types non dénotables dans l'attribut LocalVariableTypeTable

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X