Das Folgende ist ein Ausschnitt darüber, wie eine generische Java-Klasse erstellt wird, um ein einzelnes Element an ein Array anzuhängen. Wie kann ich appendToArray zu einer statischen Methode machen? Das Hinzufügen von Statik zur Methodensignatur führt zu Kompilierungsfehlern.
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;
}
}
Antworten:
Sie können nur Ihre Signatur in ändern
Wichtige Details:
Generische Ausdrücke vor dem Rückgabewert führen immer eine neue generische Typvariable ein (deklarieren sie).
Außerdem stören sich Typvariablen zwischen types (
ArrayUtils
) und statischen Methoden (appendToArray
) nie gegenseitig.Also, was bedeutet das: In meiner Antwort
<E>
würde verstecken dieE
aus ,ArrayUtils<E>
wenn das Verfahren nicht wärestatic
. UND<E>
hat nichts mit demE
von zu tunArrayUtils<E>
.Um diese Tatsache besser widerzuspiegeln, wäre eine korrektere Antwort:
quelle
E
und der statischen Methodentypvariablen gibtE
. Ich halte es für viel besser, einen anderen Variablennamen zu verwenden, wenn generische Methoden statisch oder anderweitig in generischen Klassen deklariert werden.Beachten Sie die
<E>
.Statische generische Methoden benötigen eine eigene generische Deklaration (
public static <E>
), die von der generischen Deklaration (public class ArrayUtils<E>
) der Klasse getrennt ist .Wenn sich der Compiler über eine Typmehrdeutigkeit beim Aufrufen einer statischen generischen Methode beschwert (in Ihrem Fall ebenfalls nicht wahrscheinlich, aber im Allgemeinen nur für den Fall), können Sie eine statische generische Methode mit einem bestimmten Typ (
_class_.<_generictypeparams_>_methodname_
) explizit aufrufen :Dies würde nur passieren, wenn der Compiler den generischen Typ nicht bestimmen kann, da z. B. der generische Typ nicht mit den Methodenargumenten zusammenhängt.
quelle
Sie müssen den Typparameter auf die Methodenebene verschieben, um anzuzeigen, dass Sie eine generische Methode anstelle einer generischen Klasse haben:
quelle
Ich werde es auf einfache Weise erklären.
Auf Klassenebene definierte Generika sind vollständig von den auf (statischer) Methodenebene definierten Generika getrennt.
Wenn Sie den obigen Code irgendwo sehen, beachten Sie bitte, dass das auf Klassenebene definierte T nichts mit dem in der statischen Methode definierten T zu tun hat. Der folgende Code ist ebenfalls vollständig gültig und entspricht dem obigen Code.
Warum muss die statische Methode ihre eigenen Generika haben, die von denen der Klasse getrennt sind?
Wenn Sie also die statische Methode aufrufen,
JVM interpretiert es wie folgt.
Beide geben die gleichen Ausgänge.
quelle