Die geeignete Methode kann nicht mit Java Generics ausgewählt werden

8

Dieses Programm macht nicht, was ich wollte. Es druckt "traurig" zweimal, während ich hoffte, dass es "glücklich" und dann "traurig" drucken würde.

%Vor%     
user1807948 06.12.2014, 03:19
quelle

2 Antworten

9

Dies wird in diesem Blog erklärt: Ссылка

relevantes Zitat:

  

Wie kann das passieren? Wir übergeben ein Argument vom Typ String an die überladene Methode und trotzdem wird die Version für den Typ Object aufgerufen. Der Grund dafür ist, dass der Compiler nur eine Bytecode-Repräsentation pro generischem Typ oder Methode erstellt und alle Instanzen des generischen Typs oder der generischen Methode dieser einen Repräsentation zuordnet.

In unserem Beispiel wird die generische Methode in folgende Darstellung übersetzt:

(Bearbeiten: Ich habe die Methode so geändert, dass sie mit dieser Frage übereinstimmt)

%Vor%
  

Angesichts dieser Übersetzung sollte es offensichtlich sein, warum die Objektversion der überladenen Methode aufgerufen wird. Es ist völlig irrelevant, welcher Objekttyp an die generische Methode übergeben und dann an die überladene Methode weitergegeben wird. Wir werden immer einen Aufruf der Objektversion der überladenen Methode beobachten.

     

Allgemein gesprochen: Die Überladungsauflösung erfolgt zur Kompilierungszeit, dh der Compiler entscheidet, welche überladene Version aufgerufen werden muss. Der Compiler tut dies, wenn die generische Methode in ihre eindeutige Bytecodedarstellung übersetzt wird. Während dieses Übersetzungstyps wird eine Löschung durchgeführt, was bedeutet, dass Typparameter durch ihre äußerste linke Grenze oder Object ersetzt werden, wenn keine Grenze angegeben wurde. Folglich bestimmt die linke Grenze oder das Objekt, welche Version einer überladenen Methode aufgerufen wird. Welche Art von Objekt zur Laufzeit an die Methode übergeben wird, ist für die Überladungsauflösung völlig irrelevant.

Das sehen Sie, wenn Sie sich den kompilierten Bytecode anschauen:

%Vor%

Um zu erreichen, was Sie wollen, sollten Sie wahrscheinlich das Strategie-Pattern verwenden.

%Vor%     
dkatzel 06.12.2014, 03:41
quelle
1

Wenn Sie das generische Element mit Integer für T instanziieren, wird T immer Integer überschreiben, da Java Generics mit type-Löschung implementiert.

    
Eric Smith 06.12.2014 03:30
quelle

Tags und Links