Erstellen eines parametrisierten Objekttyps mit anonymer Klasse

8

Das ist vielleicht eine blöde Frage, aber ich habe gerade eine Frage gesehen, die fragt: wie man eine Type-Variable für einen generischen Typ erstellt . Der Konsens schien zu sein, dass Sie eine Dummy-Methode haben sollten, die diesen Typ zurückgibt, und dann Reflektion verwenden, um sie zu erhalten (in diesem Fall wollte er Map<String, String> ). Etwas wie das:

%Vor%

Meine Frage ist, nicht so viel Reflexion benutzt zu haben, könntest du nicht einfach etwas tun wie:

%Vor%

Würde das funktionieren? Wenn nicht, warum nicht? Und was sind einige der Gefahren / Probleme, wenn sie es tun (abgesehen davon, dass sie einen Typ wie Integer<String> zurückgeben können, was offensichtlich nicht möglich ist.

    
Andrei Fierbinteanu 07.06.2010, 12:34
quelle

3 Antworten

6

Sicher könnte man das, und für die meisten Anwendungen würde es wahrscheinlich ausreichen.

Mit der ersten Methode erhalten Sie jedoch ein raffinierteres Objekt. Angenommen, Sie erstellen ein Objekt type1 mit der ersten Methode und type2 mit der zweiten Methode. Dann würde type1.equals(type2) true zurückgeben (da die erste Methode ein Objekt zurückgibt, das die equals-Methode korrekt implementiert), aber type2.equals(type1) würde false zurückgeben (da in der zweiten Methode die equals-Methode nicht überschrieben wurde und verwendet wird die Implementierung von Object ).

Dies gilt auch für andere (manchmal nützliche Methoden) wie toString , hashCode usw. Die zweite Methode bietet keine sinnvollen Implementierungen von diesen.

    
aioobe 07.06.2010, 12:45
quelle
5
___ answer2989556 ___

Sicher könnte man das, und für die meisten Anwendungen würde es wahrscheinlich ausreichen.

Mit der ersten Methode erhalten Sie jedoch ein raffinierteres Objekt. Angenommen, Sie erstellen ein Objekt TypeToken mit der ersten Methode und Type mit der zweiten Methode. Dann würde List<String> true zurückgeben (da die erste Methode ein Objekt zurückgibt, das die equals-Methode korrekt implementiert), aber Type würde false zurückgeben (da in der zweiten Methode die equals-Methode nicht überschrieben wurde und verwendet wird die Implementierung von HashMap<String, String> ).

Dies gilt auch für andere (manchmal nützliche Methoden) wie Type , .equals() usw. Die zweite Methode bietet keine sinnvollen Implementierungen von diesen.

    
___ qstnhdr ___ Erstellen eines parametrisierten Objekttyps mit anonymer Klasse ___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ qstntxt ___

Das ist vielleicht eine blöde Frage, aber ich habe gerade eine Frage gesehen, die fragt: wie man eine Type-Variable für einen generischen Typ erstellt . Der Konsens schien zu sein, dass Sie eine Dummy-Methode haben sollten, die diesen Typ zurückgibt, und dann Reflektion verwenden, um sie zu erhalten (in diesem Fall wollte er Type ). Etwas wie das:

%Vor%

Meine Frage ist, nicht so viel Reflexion benutzt zu haben, könntest du nicht einfach etwas tun wie:

%Vor%

Würde das funktionieren? Wenn nicht, warum nicht? Und was sind einige der Gefahren / Probleme, wenn sie es tun (abgesehen davon, dass sie einen Typ wie TypeToken zurückgeben können, was offensichtlich nicht möglich ist.

    
___ answer2989646 ___

Ich glaube, der einfachste Weg (== Least Code) wäre eine Dummy-Schnittstelle, die den Typ erweitert, an dem Sie interessiert sind, und dann TypeToken von seiner Klasse (verwenden Sie %code% wenn Sie an einer Klasse interessiert sind:

%Vor%

Es skaliert jedoch nicht gut, da Sie für jede %code% , die Sie darstellen möchten, eine neue Klasse erstellen müssen. Ich sehe nicht, warum Ihre Implementierung nicht funktionieren würde (es sei denn, es gibt irgendwo verengte Casts), und es hat den attraktiven Vorteil, dass Sie es wiederverwendbar machen können.

    
___ tag123generics ___ Generika sind eine Form von parametrischer Polymorphie, die in einer Reihe von Sprachen gefunden wird, einschließlich .NET-Sprachen, Java und Swift. ___ antwort13202444 ___

Wenn Sie die Guava -Bibliothek von Google in Ihr Projekt aufnehmen (sollten Sie; es ist großartig), verwenden Sie < a href="http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/reflect/TypeToken.html"> %code% , um einen Typ zu erhalten . Die Google Gson -Bibliothek (für die Interaktion mit JSON) hat eine ähnliche version . Beide werden wie folgt verwendet (um eine %code% für %code% :

zu erhalten) %Vor%

Wenn Sie sich nicht auf Bibliotheken von Drittanbietern verlassen möchten, können Sie anonyme Typen verwenden, um einen generischen konkreten -Typ mit einer Codezeile zu erhalten (diese Technik funktioniert nicht mit Schnittstellen) und könnte mehr Probleme bereiten, als es für abstrakte Typen wert ist). Um eine %code% für %code% zu erhalten, tun Sie Folgendes:

%Vor%

Ich habe bestätigt, dass die von Gson erstellten %code% instance %code% und %code% Instanzen erstellt wurden 's %code% , obwohl sie für die Guava Version von %code% , auf die ich im Moment keinen Zugriff habe. (Guava ist eine allgemeinere Bibliothek, die für alle möglichen Dinge so praktisch ist, dass Sie sie wahrscheinlich sowieso benutzen sollten.)

    
___
Matt Leidholm 02.11.2012 20:16
quelle
2

Ich glaube, der einfachste Weg (== Least Code) wäre eine Dummy-Schnittstelle, die den Typ erweitert, an dem Sie interessiert sind, und dann getGenericInterfaces()[0] von seiner Klasse (verwenden Sie getGenericSuperclass() wenn Sie an einer Klasse interessiert sind:

%Vor%

Es skaliert jedoch nicht gut, da Sie für jede ParameterizedType , die Sie darstellen möchten, eine neue Klasse erstellen müssen. Ich sehe nicht, warum Ihre Implementierung nicht funktionieren würde (es sei denn, es gibt irgendwo verengte Casts), und es hat den attraktiven Vorteil, dass Sie es wiederverwendbar machen können.

    
gustafc 07.06.2010 12:56
quelle

Tags und Links