? gegen T

7

Ich stolperte über eine Funktion, die folgendermaßen aussieht:

%Vor%

Was sind die Vor- / Nachteile der Änderung der Methode zu:

%Vor%

edit: was sind die Kompilierzeit / Laufzeit diff.

    
Schildmeijer 29.03.2009, 16:30
quelle

4 Antworten

7

todd.run ist völlig richtig, aber das ist nur die halbe Antwort. Es gibt auch Anwendungsfälle für die Auswahl von <T> über <?> (oder umgekehrt), die angewendet werden, wenn Sie der Klasse, die die Methode einschließt, keinen Typparameter hinzufügen. Betrachten Sie beispielsweise den Unterschied zwischen

%Vor%

und

%Vor%

Die erste Methode wird tatsächlich nicht kompiliert, WENN Sie der umgebenden Klasse keinen geeigneten Typparameter hinzufügen, während die zweite Methode kompiliert, unabhängig davon, ob die einschließende Klasse einen Typparameter hat. Wenn Sie <?> nicht verwenden, sind Sie lokal dafür verantwortlich, dem Compiler mitzuteilen, wie der Typ zu ermitteln ist, der an Stelle des Buchstabens ausgefüllt wird. Sie stoßen häufig auf dieses Problem - müssen Sie verwenden? eher als T - beim Versuch, generische Methoden zu schreiben, die "extends" und "super" verwenden oder benötigen. Eine bessere, aber ausführlichere Behandlung dieses Problems finden Sie auf Seite 18 von Gilad Brachas Generics Tutorial (PDF) . Siehe auch diese Stapelüberlauffrage , deren Antwort beleuchtet diese Fragen.

Sehen Sie sich diesen Stack-Überlauf-Link an, um Informationen zu Ihrer zweiten Frage zu erhalten: Java Generics - Art Löschen - wann und was passiert . Während ich die Antwort auf Ihre Frage über den Kompilierzeitunterschied zwischen <?> und <T> nicht weiß, bin ich ziemlich sicher, dass die Antwort bei diese FAQ , dass Erickson in diesem Post erwähnt wurde.

    
P. Myer Nore 29.03.2009, 22:33
quelle
10

Verwenden von "?" ist das gleiche wie "any", während "T" "ein bestimmter Typ" bedeutet. Vergleichen Sie diese Schnittstellen also:

%Vor%

Nun können wir Klassen erstellen:

%Vor%

Hoffe das hilft!

    
Todd R 29.03.2009 17:02
quelle
2

Grundsätzlich sind sie gleichwertig. Sie können die erste Syntax verwenden, in der Sie nichts vom Typ T deklarieren müssen.

UPDATE: oh, und T kann verwendet werden, um Typen miteinander zu verbinden: Wenn Class<T> in verschiedenen Teilen der Funktion verwendet wird, bezieht es sich auf dieselbe Klasse, aber nicht auf Class<?> .

    
Maurice Perry 29.03.2009 16:32
quelle
0

Eine gute Ressource könnte dies sein: Ссылка Der interessante Teil zu Ihrer Frage beginnt um die 5. Minute. Nur in Abhängigkeit von dem, was vorherige Benutzer gesagt haben.

Hoffe das hilft:]

    
Alberto Zaccagni 30.03.2009 12:16
quelle

Tags und Links