Java 7 Diamond Operation im Methodenaufruf

9

Dies ist eine Art Nachfolgefrage in der Diskussion:

Warum nicht? t Arbeitet der Diamond-Operator in einem Aufruf von addAll () in Java 7?

Aus dem Java-Lernprogramm

Ссылка

  

Beachten Sie, dass der Diamant oft in Methodenaufrufen funktioniert; Aus Gründen der Übersichtlichkeit wird jedoch empfohlen, den Diamanten hauptsächlich zum Initialisieren einer Variablen zu verwenden, in der

deklariert ist

Also, ich bin etwas verwirrt über die erste Zeile. Wenn Diamant in Methodenaufrufen funktioniert?

Ein bisschen mehr Erklärung, wie Diamant-Operator funktioniert, finden Sie hier:

Ссылка ?

Und ich habe Folgendes versucht, was gut funktioniert:

Geben Sie mir Folgendes:

%Vor%

ein Anruf wie folgt kompiliert:

%Vor%

Der Typparameter beim Aufrufen des Konstruktors im Methodenaufruf von f() oben wird aus dem Argument für den Konstruktor abgeleitet (d. h. Integer ).

So ist das gemeint, wenn das Tutorial sagt

  

Beachten Sie, dass der Diamant oft in Methodenaufrufen funktioniert

Wenn nicht, kann jemand freundlich genug sein, um ein Beispiel zu geben, wo Diamant in Methodenaufruf funktioniert?

    
Sa'ad 26.12.2011, 16:46
quelle

3 Antworten

3
  

So ist das gemeint, wenn das Tutorial sagt

Ich denke ja, obwohl es ein paar Fehler gibt, wenn es um <> operators geht.

In Ihrem Fall ist die Box-Instanziierung kein Problem, da der Typ mithilfe des Konstruktorarguments trivial abgeleitet werden kann. Versuchen Sie, den Konstruktor so zu ändern, dass er ein Integer oder T nicht übernimmt und sehen Sie, wie der Aufruf fehlschlägt.

%Vor%

Sehen Sie sich auch diese Klasse an:

%Vor%

Ebenso kann das Problem in Ihrer verknüpften Frage (in addAll ) einfach gelöst werden, indem Sie den Compiler ein bisschen wie folgt aushelfen:

%Vor%

Diamantoperatoren scheinen auch zu brechen, wenn es darum geht, anonyme Klassen wie folgt zu implementieren:

%Vor%

Glücklicherweise erwähnt der Compiler in diesem Fall ziemlich explizit, dass <> nicht mit anonymen Klassen arbeitet.

    
Sanjay T. Sharma 26.12.2011 17:47
quelle
1

Ich denke nicht, dass es sich lohnt, darüber nachzudenken, wann es funktioniert und wann nicht. Der Compiler wird es Ihnen sagen, und Sie müssen neu schreiben, was nicht funktioniert.

Es gibt keine echte Begründung dahinter; Es ist eher so, als hätten die Entwickler die aktuellen Einschränkungen der Implementierung des eigentlichen Compilers zu einem bestimmten Zeitpunkt in die Spezifikation aufgenommen und uns gesagt: So muss es sein.

Java 8 hebt viele dieser Einschränkungen auf, ohne dass die Hölle einfriert. ZB

%Vor%

kompiliert mit Java 8 ohne Fehler. Und warum nicht?

    
Holger 05.02.2014 19:05
quelle
0

Es geht nicht wirklich um Methodenaufruf. Die eigenständige Anweisung

%Vor%

kompiliert auch. Es gibt genügend Informationen, um T für Box abzuleiten (d. H. Aus dem Integer-Argument)

Auf der anderen Seite kompiliert dies nicht

%Vor%

Es gibt keine Möglichkeit zu wissen, welche Art von Liste gewünscht wird.

%Vor%

Das funktioniert, weil Inferenz durch den Zieltyp Collection<String>

unterstützt wird     
irreputable 26.12.2011 21:29
quelle

Tags und Links