Java non vérifié: création de tableau générique non cochée pour le paramètre varargs

J’ai défini Netbeans pour afficher des avertissements non vérifiés dans mon code Java, mais je ne parviens pas à comprendre l’erreur sur les lignes suivantes:

private List cocNumbers; private List vatNumbers; private List ibans; private List banks; ... List<List> combinations = Utils.createCombinations(cocNumbers, vatNumbers, ibans); 

Donne:

[unchecked] unchecked generic array creation for varargs parameter of type List[]

Source de méthode:

 /** * Returns a list of all possible combinations of the entered array of lists. * * Example: [["A", "B"], ["0", "1", "2"]] * Returns: [["A", "0"], ["A", "1"], ["A", "2"], ["B", "0"], ["B", "1"], ["B", "2"]] * * @param  The type parameter * @param elements An array of lists * @return All possible combinations of the entered lists */ public static  List<List> createCombinations(List... elements) { List<List> returnLists = new ArrayList(); int[] indices = new int[elements.length]; for (int i = 0; i < indices.length; i++) { indices[i] = 0; } returnLists.add(generateCombination(indices, elements)); while (returnLists.size() < countCombinations(elements)) { gotoNextIndex(indices, elements); returnLists.add(generateCombination(indices, elements)); } return returnLists; } 

Que se passe-t-il exactement et comment pourrais-je résoudre ce problème, car je suppose que laisser des avertissements non vérifiés dans le code n’est pas une bonne idée?

J’ai oublié de mentionner, mais j’utilise Java 7.

Edit : Aussi je vois maintenant que la méthode a le suivant:

 [unchecked] Possible heap pollution from parameterized vararg type List where T is a type-variable: T extends Object declared in method createCombinations(List...) 

    Comme janoh.janoh mentionné ci-dessus, varargs en Java n’est qu’un sucre syntaxique pour les tableaux, plus la création implicite d’un tableau sur le site appelant. Alors

     List> combinations = Utils.createCombinations(cocNumbers, vatNumbers, ibans); 

    est en fait

     List> combinations = Utils.createCombinations(new List[]{cocNumbers, vatNumbers, ibans}); 

    Mais comme vous le savez peut-être, la new List[] n’est pas autorisée dans Java, pour des raisons abordées dans de nombreuses autres questions, mais principalement parce que les baies connaissent leur type de composant lors de l’exécution et vérifient runtime si les éléments ajoutés correspondent à son type de composant, mais cette vérification est impossible pour les types paramétrés.

    Quoi qu’il en soit, plutôt que d’échouer, le compilateur crée toujours le tableau. Il fait quelque chose de similaire à ceci:

     List> combinations = Utils.createCombinations((List[])new List< ?>[]{cocNumbers, vatNumbers, ibans}); 

    Ceci est potentiellement dangereux, mais pas nécessairement dangereux. La plupart des méthodes varargs ne font que parcourir les éléments varargs et les lire. Dans ce cas, il ne se soucie pas du type d’exécution du tableau. C’est le cas avec votre méthode. Puisque vous êtes sur Java 7, vous devez append l’annotation @SafeVarargs à votre méthode et vous ne recevrez plus cet avertissement. Cette annotation dit essentiellement, cette méthode ne se soucie que des types d’éléments, pas du type du tableau.

    Cependant, certaines méthodes varargs utilisent le type d’exécution du tableau. Dans ce cas, il est potentiellement dangereux. C’est pourquoi l’avertissement est là.

    Parce que le compilateur Java utilise une création de tableau implicite pour varargs, et Java n’autorise pas la création d’un tableau générique (parce que l’argument de type n’est pas reifiable).

    Le code ci-dessous est correct (ces opérations sont autorisées avec les tableaux), un avertissement non contrôlé est donc nécessaire:

     public static  List> createCombinations(List ... lists) { ((Object[]) lists)[0] = new ArrayList(); // place your code here } 

    Voir une explication complète ici

    Comment se passe la suppression de l’avertissement?

     @SuppressWarnings("unchecked")