Typ löschen, überschreiben und Generika

Kann mir jemand erklären warum

@Override public void fooMethod(Class c) 

überschreibt nicht

 public void fooMethod(Class c) 

und gibt mir stattdessen folgende Fehler:

  - Namenskonflikt: Die Methode fooMethod (class ) 
 vom Typ SubClass hat das gleiche Löschen wie fooMethod (Class) von 
 Geben Sie SuperClass ein, überschreiben Sie es jedoch nicht

  - Die Methode fooMethod (class ) Vom Typ 
 SubClass muss eine Superklassenmethode überschreiben

?

Edit:java -version ” sagt Java (TM) 2 Laufzeitumgebung, Standard Edition (Build 1.5.0_16-b06-284). Was das Code-Snippet betrifft, ist es schon oben, ziemlich genau; das obige erweitert das eine unten.

Die Signatur von fooMethod(Class< ?>) die gleiche wie die Signatur von fooMethod(Class) nach dem Löschen, da das Löschen von Class< ?> Einfach Class ( JLS 4.6 ) ist. Daher ist fooMethod(Class) eine Subsignatur des fooMethod(Class< ?>) , Nicht aber das Gegenteil ( JLS 8.4.2 ).

Zum Überschreiben mit Instanzmethoden benötigen Sie die überschreibende Methode als Untersignatur der überschriebenen Methode ( JLS 8.4.8.1 ). Dies ist hier eindeutig nicht der Fall.

Nachdem wir nun festgestellt haben, dass Ihre Unterklassenmethode die Superklassenmethode nicht gemäß der JLS überschreibt, sehen wir uns die Auswirkungen auf die Laufzeit an, wenn das Löschen von Typen aufgetreten ist. Wir haben jetzt zwei Methoden, die genau die gleichen aussehen (gleicher Name, gleiche Parametertypen), aber sich nicht gegenseitig übersteuern. Wenn sie nicht überschrieben werden, müssen sie beide als separate Methoden im Subtyp verfügbar sein, sie haben jedoch identische Laufzeitunterschriften: Konflikt. Also muss Java es ablehnen.

Das Überschreiben generischer Parametertypen mit Raw-Parametertypen ist zulässig, da Raw-Typen nur aus diesem Grund existieren: Sie sind ein praktischer Mechanismus mit spezifischen Regeln für nicht zulässige Regeln, um die Interaktion mit Legacy-Code zu ermöglichen. Also wird das Typsystem hier entscheiden, dass die Unterklassenmethode die Oberklasse eins überschreibt, sie sind nach dem Löschen des Typs identisch und wir können niemals einen Konflikt haben. Als eine Folge davon können Bibliotheken unabhängig von existierendem nicht-generischem Code generifiziert werden.

Weil Class< ?> Spezifischer als nur Class .

Zum Beispiel kann foo(Class) foo(Class) nicht überschreiben. Ich vergesse den Begriff, aber Typen mit Generika werden immer anders sein als solche ohne.