Comment rendre une méthode Java Generic statique?

Ce qui suit est un extrait sur la façon de créer une classe générique Java pour append un seul élément à un tableau. Comment puis-je faire de appendToArray une méthode statique? L’ajout de statique à la signature de la méthode entraîne des erreurs de compilation.

public class ArrayUtils { public E[] appendToArray(E[] array, E item) { E[] result = (E[])new Object[array.length+1]; result[array.length] = item; return result; } } 

la seule chose que vous pouvez faire est de changer votre signature pour

 public static  E[] appendToArray(E[] array, E item) 

Détails importants:

Les expressions génériques précédant la valeur de retour introduisent toujours (declare) une nouvelle variable de type générique.

De plus, les variables de type entre les types ( ArrayUtils ) et les méthodes statiques ( appendToArray ) n’interfèrent jamais les unes avec les autres.

Alors, qu’est-ce que cela signifie: dans ma réponse, cacherait le E de ArrayUtils si la méthode n’est pas static . AND n’a rien à voir avec le E de ArrayUtils .

Pour mieux refléter ce fait, une réponse plus correcte serait:

 public static  I[] appendToArray(I[] array, I item) 
 public static  E[] appendToArray(E[] array, E item) { ... 

Notez le .

Les méthodes génériques statiques ont besoin de leur propre déclaration générique ( public static ) distincte de la déclaration générique de la classe ( public class ArrayUtils ).

Si le compilateur se plaint d’une ambiguïté de type en invoquant une méthode générique statique (encore peu probable dans votre cas, mais généralement, juste au cas où), voici comment invoquer explicitement une méthode générique statique utilisant un type spécifique ( _class_.<_generictypeparams_>_methodname_ ):

 Ssortingng[] newSsortingngs = ArrayUtils.appendToArray(ssortingngs, "another ssortingng"); 

Cela ne se produira que si le compilateur ne peut pas déterminer le type générique car, par exemple, le type générique n’est pas lié aux arguments de la méthode.

Vous devez déplacer le paramètre type au niveau de la méthode pour indiquer que vous avez une méthode générique plutôt qu’une classe générique:

 public class ArrayUtils { public static  E[] appendToArray(E[] array, E item) { E[] result = (E[])new Object[array.length+1]; result[array.length] = item; return result; } }