Durch das Hinzufügen von Generic können Sie eine Methode mit einem anderen Rückgabetyp überschreiben?

8

Ich bin heute darauf gestoßen und das Einzige, was ich denken kann, ist, dass dies ein Fehler im Java-Compiler ist. Der folgende Code wird kompiliert, scheint aber inkorrekt zu sein (da testMethod eine differenet-Signatur im untergeordneten Objekt hat, aber das übergeordnete Element außer Kraft setzt) ​​und Klassenübergabe-Ausnahmen zur Laufzeit auslöst.

%Vor%

Und mit der obigen Struktur:

%Vor%

All dies kompiliert sich gut, wird aber offensichtlich Klassenausnahmen auslösen, wenn Sie es ausführen.

Wenn Sie <T> von TestInterface entfernen oder T in die Zeile TestClass implements TestInterface<T> füllen, wird der Code nicht mehr kompiliert, was sinnvoll ist. Imo <T> sollte keinen Einfluss auf die Kompilierung von testMethod haben, da es in dieser Methode keine Rolle spielt.  Vielleicht führt das Hinzufügen von <T> zu TestInterface dazu, dass der Compiler die Methodensignaturen typisiert löscht, obwohl T nicht an diesen Methoden teilnimmt ...?

Weiß jemand, was hier vor sich geht?

    
Matt Crinklaw-Vogt 28.03.2011, 17:05
quelle

2 Antworten

9

Wenn Sie eine generische Klasse als Raw-Typ instanziieren, werden die darin enthaltenen all generischen Typparameter vom Compiler weggelassen, so dass Sie während der Kompilierung keine Warnungen / Fehler erhalten. I.e. erklären

%Vor%

reduziert effektiv den Code in

%Vor%

was in der Tat gut funktioniert.

Ein ähnliches Problem wurde vor einigen Wochen veröffentlicht, Die Antwort darauf , dass es sich nicht um einen Compiler-Bug handelt, sondern um eine bewusste Design-Entscheidung für Rückwärtskompatibilität.

    
Péter Török 28.03.2011, 17:17
quelle
0

Wie ich es verstehe, ist Generika eine Compiler-Seite. In der Klassendatei ist nichts über die generischen Informationen enthalten, es ist wie ein Compiler-Hack. Aus diesem Grund können Sie generisch geladene Anrufe problemlos mit generisch freien Klassen kombinieren, und zur Laufzeit gibt es kein Problem. Ich habe gehört, dass all diese dotnet-Sachen die generischen Informationen zu einem erstklassigen Bürger in der Objektdatei machen.

Wie auch immer, diese Jungs kennen Ihr Problem offensichtlich besser als ich, aber Sie sollten bedenken, dass alles, was wirklich los ist, Compilerflaum ist.

    
stu 28.03.2011 17:23
quelle

Tags und Links