Ce qui suit est un extrait de code sur la façon de créer une classe générique java pour ajouter un seul élément à un tableau. Comment puis-je faire de appendToArray une méthode statique. L'ajout de statique à la signature de méthode entraîne des erreurs de compilation.
public class ArrayUtils<E> {
public E[] appendToArray(E[] array, E item) {
E[] result = (E[])new Object[array.length+1];
result[array.length] = item;
return result;
}
}
Réponses:
la seule chose que vous pouvez faire est de changer votre signature en
Détails importants:
Les expressions génériques précédant la valeur de retour introduisent (déclarent) toujours 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 veut dire: Dans ma réponse
<E>
cacherait laE
deArrayUtils<E>
si la méthode ne serait passtatic
. AND<E>
n'a rien à voir avec leE
fromArrayUtils<E>
.Pour mieux refléter ce fait, une réponse plus correcte serait:
la source
E
et la variable de type de méthode statiqueE
. Je considère qu'il est préférable d'utiliser un nom de variable différent lors de la déclaration de méthodes génériques, statiques ou non, à l'intérieur de classes génériques.Notez le
<E>
.Les méthodes génériques statiques ont besoin de leur propre déclaration générique (
public static <E>
) distincte de la déclaration générique de la classe (public class ArrayUtils<E>
).Si le compilateur se plaint d'une ambiguïté de type en invoquant une méthode générique statique (encore une fois peu probable dans votre cas, mais, en général, juste au cas où), voici comment invoquer explicitement une méthode générique statique en utilisant un type spécifique (
_class_.<_generictypeparams_>_methodname_
):Cela ne se produirait que si le compilateur ne peut pas déterminer le type générique parce que, par exemple, le type générique n'est pas lié aux arguments de la méthode.
la source
Vous devez déplacer le paramètre de 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:
la source
Je vais l'expliquer d'une manière simple.
Les génériques définis au niveau de la classe sont complètement séparés des génériques définis au niveau de la méthode (statique).
Lorsque vous voyez le code ci-dessus n'importe où, veuillez noter que le T défini au niveau de la classe n'a rien à voir avec le T défini dans la méthode statique. Le code suivant est également entièrement valide et équivalent au code ci-dessus.
Pourquoi la méthode statique doit-elle avoir ses propres génériques séparés de ceux de la classe?
Ainsi, chaque fois que vous appelez la méthode statique,
JVM l'interprète comme suit.
Les deux donnant les mêmes sorties.
la source