Ich habe eine Schnittstelle, die sicherstellt, dass Objekte Kopien von sich selbst machen können:
%Vor%Ich habe jetzt
%Vor%aber ich habe auch eine Klasse Y, die X erweitert.
Das ist kein Problem, bis ich eine andere generische Klasse brauche:
%Vor% Ich kann eine generische Version von DoStuffWithDuplicable nicht mit Y verwenden, da sie nicht Duplicable<Y>
, sondern Duplicable<X>
implementiert, da sie von X geerbt wird.
Also habe ich es versucht
%Vor%.. aber das bedeutet später eine unsichere Besetzung einzuführen
%Vor%im Codebody. Auch die Klassenparameter sind verschachtelter und die Verwendung der Klasse schwieriger zu verstehen. Irgendwelche Ideen, wie man dieses Problem umgehen kann?
Ich habe deine Frage vielleicht nicht richtig verstanden, aber ich werde es versuchen.
Zuerst, warum haben Sie eine Schnittstelle, die sich so erweitert?
Was Sie ausprobieren können, ist dies:
%Vor%Wenn Sie dann eine andere Klasse verwenden, in der der generische Parameter Duplicable sein soll, tun Sie das folgendermaßen:
%Vor%Wenn Sie nun von X erben, muss jede generische Komponente in den Unterklassen Duplicable sein.
Dies ist in Java nicht möglich.
Angenommen, Sie rufen obj.duplicate () für ein Objekt vom Typ Y auf. Dann kann das Typsystem nur sicherstellen, dass es ein Objekt vom Typ X zurückgibt, da Y Duplicate & lt; X & gt;.
implementiertSie können jedoch einfach ein DoStuffWithDuplicable & lt; X & gt; und übergeben Sie ihm Y-Objekte.
%Vor%Bei Rückgabewerten kann der Client Ihrer Bibliothek nur sichere Casts verwenden, da er wahrscheinlich die konkreten Typen kennt.
Eine andere Option wäre, unsichere Umwandlungen in der Bibliothek zu verwenden und die Typen manuell zu überprüfen:
%Vor%