Ich weiß, dass ich das nicht tun kann:
%Vor%Weil ich die Compiler-Beschwerde bekomme:
%Vor% Ich verstehe das, weil sowohl T
als auch S
dieselbe Klasse erweitern könnten. So kann ich ihm sagen "Nein, sie sind nicht gleich, also nimm es leicht"
Dann ist meine Frage, gibt es eine Möglichkeit, dem Compiler zu sagen, dass T
und S
von verschiedenen Klassen ausgehen, ohne zu sagen, welche im Konkreten? Ich meine, in diesem letzten Fall habe ich angegeben, welche Klassen T
und S
(jeweils erweitert) sein müssen. Aber was, wenn ich es generischer haben möchte und sie nicht spezifiziere? Ich möchte dem Compiler sagen: "Hey, Compiler, T
und S
sind nicht gleich! Sie sind verschiedene Klassen. Ich weiß nicht genau, welche Klassen sie sind, aber ich bin mir sicher, dass sie das sind anders ".
Es gibt keinen offensichtlichen Weg. (Obwohl Sie einen bauen können, wie ich unten zeige.)
Diese Überladungsregel beruht auf einer Einschränkung, wie der Supertyp (in diesem Fall die Schnittstelle), der die Überladungen deklariert, in Bytecode übersetzt wird (durch Löschen).
Wenn ein allgemeiner Parameter T
deklariert ist, wird eine Methode, die T
in ihrer Signatur verwendet, einen Bytecode als Obergrenze von T
erzeugen, zum Beispiel
wird auf
gelöscht %Vor%und
%Vor%wird auf
gelöscht %Vor%So funktioniert das beschränkte Beispiel, weil die Überladungen anders gelöscht werden.
%Vor%Aber ohne bestimmte Grenzen, welcher gelöschte Bytecode sollte für die überladenen Methoden erzeugt werden?
Daher ist Ihr T
und S
, das anders als der Untertyp ist, nicht wichtig. Wichtig sind die bekannten deklarierten Grenzen, die in gelöschten Bytecode für die Supertype-Klasse übersetzt werden.
Eine mögliche Lösung könnte Marker-Schnittstellen verwenden.
%Vor%Aber ich empfehle das nicht unbedingt. Es scheint mir sehr aufwendig, wenn auch interessant. Es hängt davon ab, wie kompliziert die tatsächliche Klassenhierarchie ist.
Was Louis in den Kommentaren vorgeschlagen hat ist viel einfacher : Geben Sie den Methoden verschiedene Namen.