Statische Methode in einer generischen Klasse?
In Java, ich würde gern so etwas wie:
class Clazz<T> {
static void doIt(T object) {
//shake that booty
}
}
Aber ich bekomme
Nicht möglich ist, einen statischen Verweis auf nicht-statischen Typ T
Ich verstehe nicht, Generika über die einfachen verwendet und kann daher nicht viel Sinn. Es hilft nicht, dass ich nicht in der Lage zu finden, viel info im internet über das Thema.
Könnte jemand klären, ob eine solche Nutzung möglich ist, durch eine ähnliche Art und Weise? Auch, warum war meine ursprüngliche Versuch erfolglos?
InformationsquelleAutor der Frage André Chalella | 2009-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht verwenden Sie eine Klasse einen generischen Typ-Parameter in statische Methoden oder statische Felder. Die Klasse der Typ-Parameter sind nur in dem Bereich für Instanzmethoden und instanzfelder. Für statische Felder und statische Methoden, die Sie freigegeben werden, die von allen Instanzen der Klasse werden auch Instanzen von anderen Typ-Parameter, so natürlich Sie können nicht abhängig von einem bestimmten Typ-parameter.
Es scheint nicht, wie sollte dein problem mit der Klasse der Typ-parameter. Wenn Sie beschreiben, was Sie zu tun versuchen, im detail, vielleicht können wir Ihnen helfen, einen besseren Weg, es zu tun.
InformationsquelleAutor der Antwort newacct
Java nicht weiß, was
T
ist, bis Sie ein Typ instanziiert.Vielleicht können Sie ausführen, werden statische Methoden durch aufrufen von
Clazz<T>.doit(something)
aber es klingt wie Sie nicht können.Den anderen Weg, um Dinge zu handhaben, ist der Typ-parameter in der Methode selbst:
das bedeutet nicht, erhalten Sie das Recht, die Beschränkung auf U, aber es ist besser als nichts....
InformationsquelleAutor der Antwort Jason S
Ich lief in das gleiche problem. Ich fand meine Antwort durch das herunterladen der source-code für
Collections.sort
im java framework. Die Antwort, die ich verwendet wurde, um die<T>
Generika in der Methode, nicht in der definition der Klasse.So, das hat funktioniert:
Natürlich, nach der Lektüre der Antworten oben erkannte ich, dass dies eine akzeptable alternative ohne Verwendung einer generischen Klasse:
InformationsquelleAutor der Antwort Chris
Ist es möglich, das zu tun, was Sie wollen, indem Sie die syntax für generischen Methoden bei der Deklaration Ihrer
doIt()
- Methode (beachten Sie die Zugabe von<T>
zwischenstatic
undvoid
in der Signatur der Methode vondoIt()
):Ich habe Eclipse-editor zu akzeptieren, die den obigen code ohne die
Cannot make a static reference to the non-static type T
Fehler und dann erweitert es um die folgenden arbeiten Programm (komplett mit etwas Alters-entsprechende kulturelle Referenz):Dem Drucke dieser Zeilen in der Konsole, wenn ich es:
InformationsquelleAutor der Antwort BD at Rivenhill
Andere haben beantwortet Ihre Frage bereits, aber darüber hinaus kann ich durchweg empfehlen Ihnen, die O ' Reilly Java Generics Buch. Es ist ein subtiles und Komplexes Thema bei Zeiten, und wenn es oft scheint sinnlos Einschränkungen, aber das Buch hat einen ziemlich guten job zu erklären, warum die java-generics sind, wie Sie sind.
InformationsquelleAutor der Antwort skaffman
Ist es richtig erwähnt, in der Fehlermeldung: Sie können einen statischen Verweis auf nicht-statischen Typ T. der Grund dafür ist Die Typ-parameter
T
kann ersetzt werden durch irgendeine Art argument z.B.Clazz<String>
oderClazz<integer>
etc. Aber statische Felder/Methoden werden gemeinsam von allen nicht-statischen Objekte der Klasse.Folgende Auszug stammt aus dem doc:
Als zu Recht darauf hingewiesen, von chris in seinem Antwort müssen Sie die Verwendung von type-parameter mit der Methode und nicht mit der Klasse in diesem Fall. Sie können es schreiben wie:
InformationsquelleAutor der Antwort i_am_zero
Etwas wie das folgende bekommen würde, Sie näher
EDIT: Aktualisiert, Beispiel mit mehr detail
InformationsquelleAutor der Antwort ekj
Ich denke, dass diese syntax wurde nicht aufgeführte, noch (im Fall, Sie wollen eine Methode ohne Argumente) :
Und der Ruf :
Hoffe, dies hilft jemand.
InformationsquelleAutor der Antwort Oreste Viron
Wenn Sie angeben, dass ein generischer Typ für Ihre Klasse, JVM wissen es, nur eine Instanz der Klasse, nicht definition. Jede definition hat nur parametrisierten Typ.
Generika funktionieren wie templates in C++, sollte man zuerst instanziieren der Klasse, dann die Funktion mit dem Typ angegeben wird.
InformationsquelleAutor der Antwort Marcin Cylke
Auch, um es einfach auszudrücken, es geschieht, weil der "Erasure" - Eigenschaft der Generika.Das bedeutet, dass, obwohl wir definieren
ArrayList<Integer>
undArrayList<String>
, zur compile-Zeit, es bleibt, wie zwei verschiedene konkrete Typen, aber auf die Laufzeit der JVM löscht generische Typen und schafft nur eine einzige ArrayList-Klasse statt zwei Klassen. Wenn wir also definieren Sie eine statische Typ-Methode oder etwas für einen generischen, es wird gemeinsam von allen Instanzen der generischen, in meinem Beispiel ist es das gemeinsam von beidenArrayList<Integer>
undArrayList<String>
.Das ist, warum Sie den Fehler.Eine Generische Typ-Parameter der Klasse Ist Nicht Erlaubt in einem Statischen Kontext!InformationsquelleAutor der Antwort
@BD bei Rivenhill: Da diese alte Frage hat bekommen neue Aufmerksamkeit im letzten Jahr, gehen wir nun ein bisschen, nur für die Zwecke der Diskussion.
Der Körper Ihres
doIt
Methode tut man nicht allesT
-spezifisch an allen. Hier ist es:So können Sie ganz drop alle Variablen-und code
Ok. Aber kommen wir wieder näher an das ursprüngliche problem. Der erste Typ, den die variable auf die Klasse Erklärung ist überflüssig. Nur der zweite eine über die Methode benötigt wird. Hier gehen wir wieder, aber es ist nicht die endgültige Antwort, dennoch:
Jedoch, es ist alles zu viel Aufregung um nichts, da die folgende version funktioniert genau die gleiche Weise. Alle es braucht, ist die Art der Schnittstelle auf die parameter der Methode. Keine Typ-Variablen in Sicht, nirgendwo. War das eigentlich das ursprüngliche problem?
InformationsquelleAutor der Antwort Hubert Kauker
Da statische Variablen werden gemeinsam von allen Instanzen der Klasse. Zum Beispiel, wenn Sie mit folgenden code
T ist nur verfügbar, wenn eine Instanz erstellt wird. Aber statische Methoden können verwendet werden, noch bevor Instanzen verfügbar sind. So, Generischen Typ-Parameter können nicht darauf verwiesen werden, innerhalb von statischen Methoden und Variablen
InformationsquelleAutor der Antwort Bharat Mukkala