Doppelte Interfcae Implementierung

usrr

Bekanntes Mitglied
Hallo,

jetzt hatte ich mir sowas schönes ausgedacht und dann funkt mir Java mit einer Fehlermeldung dazwischen. Da freut man sich am Sonntag morgen so richtig.

Beispielcode:

Java:
public class TestClass1 {
}

public class TestClass2 {
}

public interface TestInterface<OBJECT> {
}

public class TestImplementer implements TestInterface<TestClass1>, TestInterface<TestClass2>{
}

Fehlermeldung:

The interface TestInterface cannot be implemented more than once with different arguments: TestInterface<TestClass2> and TestInterface<TestClass1>

Was spricht dagegen ein Generic-Interface mit unterschiedlichen Typen doppelt zu implementieren?
 
Was spricht dagegen ein Generic-Interface mit unterschiedlichen Typen doppelt zu implementieren?

Weil die Type-Informationen zur Laufzeit entfernt werden und somit zweimal das gleiche Interface implementiert
werden würde. Das geht natürlich nicht.

Was willst du denn mit diesem komischen Ansatz erreichen?
 
Wenn ich es richtig verstanden habe, dann werden bei ...

Java:
TestInterface<TestClass1>

... die Platzhalter nicht durch "TestClass1" sondern durch "Object" erstezt?
 
So kann man es quasi sehen. Generics sind nur Informationen für den Compiler aber nicht für die JVM (leider). Da in beiden Fällen die selbe Methoden rauskommen (für beide Interface Implementierungen) lässt die Sprache es so nicht zu.
 
Wenn es so ist, dann ist es leider so. Aber ich verstehe nicht warum der Compiler es so machen muss. Für jede Nutzung von TestInterface<OBJECT>, könnte der Compiler doch eine eigene Source-Datei anlegen, in der eine Ersetzung von OBJECT statt findet. Wenn ich das, per Hand mache, müßte es doch auch funktionieren.
 
Klar du kannst 2 eigene Ableitungen des Interfaces machen. Da Generics aber aber anders im Bytecode gespeichert sind ist es halt so ;-)
 
Das war halt mein Fehler (Unwissen). Ich dacht Generics, hätten nichts mit dem ByteCode zu tun, sondern wären nur Schablonen für den Compiler (Precompiler).
 
Ja das ist eben etwas schwierig in Java. Tatsächlich werden Generics als Attribute für Klassen im Bytecode hinterlegt und auch generische Methoden haben neben der normalen Signatur auch eine generische Signatur. Dummerweise werden aber einfach bestimmte Dinge nicht unterstützt, weil zusätzliche Informationen für volle Runtime-Generics fehlen.

Java:
public List<String> getFoo() { ... }

An dieser Stelle kommt aber kein [c]List<String>[/c] zurück, sondern nur [c]List[/c] und damit sind die Generics zur Laufzeit gebrochen.
 

Zurück
Oben