Generische Methoden und Typ-Inferenz in Java

8

Gegeben der folgende nicht sehr nützliche Code:

%Vor%

(Bitte korrigieren Sie mein Verständnis, wenn es falsch ist!)

Der zweite Aufruf von fancy() ist ein Compilerfehler, da Java keinen gemeinsamen Typ zwischen den beiden Argumenten ableiten kann ( Object kann nicht abgeleitet werden, da der zweite Parameter ein Collection sein muss).

Der Aufruf von plain() ist nicht ein Compilerfehler, da Java den allgemeinen Typ von Object zwischen den beiden Argumenten ableitet.

Ich bin kürzlich auf Code gestoßen, der eine ähnliche Methodensignatur wie plain() hat.

Meine Frage ist das:

Ist die plain() -Signatur für irgendetwas nützlich?

Vielleicht hat die Person, die diesen Code geschrieben hat, gedacht, dass die Signatur von plain() erzwingen würde, dass beide Parameter zur Kompilierungszeit den gleichen Typ haben, was offensichtlich nicht der Fall ist.

Gibt es einen Unterschied zum Schreiben einer Methode mit einer Signatur wie plain() , oder profitieren Sie davon, anstatt beide Parameter nur als Object s zu definieren?

    
segfault 16.07.2012, 22:41
quelle

3 Antworten

4

Während der Compiler nicht den generischen Typ ableitet, den man beabsichtigen könnte, wird erzwingen, die explizit spezifiziert sind. Der folgende Aufruf führt zu einem Typfehler.

%Vor%
  

Die parametrisierte Methode & lt; String & gt; plain (String, String) vom Typ Test ist nicht anwendbar für die Argumente (String, ArrayList & lt; Integer & gt;)

    
erickson 16.07.2012, 23:46
quelle
3

Ich denke, Sie könnten sagen, dass es sich um eine Art Dokumentation handelt, so dass der Benutzer weiß, dass Sie erwarten, dass beide Argumente vom selben Typ sind. Natürlich sind any zwei Objekte bis zu einem gewissen Grad vom selben Typ (sie sind alle Object ), also ist es eine bedeutungslose Aussage.

Lange Rede, kurzer Sinn, es ist eine nutzlose Unterschrift.

Natürlich, wenn plain einen Typ T zurückgegeben hat, wäre das eine andere Geschichte.

    
yshavit 16.07.2012 22:55
quelle
1
  

Der zweite Aufruf von fancy () ist ein Compilerfehler, weil Java nicht schließen kann   ein beliebiger gemeinsamer Typ zwischen den beiden Argumenten (kann Objekt seit nicht ableiten)   Der zweite Parameter muss eine Collection sein.)

Nun, ich bin nicht sicher, dass dies der Grund ist, ich würde sagen, der Grund ist, dass der generische Typ T in Collection<T> eine Invariante ist, deren Wert den Typ des ersten Parameters T bestimmt.

Dies ist zum Beispiel gültig:

%Vor%

Weil alle String CharSequences sind. Es wird erwartet, dass der erste Parameter ein CharSequence ist, sobald der Typ von ArraysList<CharSequence> abgeleitet wurde.

Dies ist jedoch nicht gültig:

%Vor%

Da erwartet wird, dass der Typ des ersten Parameters String ist, und wir nicht sicherstellen können, dass alle CharSequences tatsächlich vom Typ String sind, richtig?

Also, AFAIK, der Grund, warum die Typen nicht kompatibel sind, liegt in der Natur der Generika in diesem Fall und nicht in der Tatsache, dass der zweite Typ ein Collection ist.

    
Edwin Dalorzo 16.07.2012 23:17
quelle

Tags und Links