Wie in den Kommentaren diskutiert, Ihr Design erfordert, dass die getCopy
Methode der „self-Typ“ zurückkehren - das heißt, eine BlueStack<T>
Umsetzung zu erwarten wäre eine BlueStack<T>
von seinem getCopy
zurückzukehren, und RedStack<T>
sollte zurückgeben RedStack<T>
usw.
Leider gibt es keine Möglichkeit, den "Selbsttyp" in Java auszudrücken. Als zhong.j.yu points out kommt ein rekursiven Parameter schließen, zum Beispiel:
//not recommended!
public interface Stack<S extends Stack<S, T>, T extends Item> {
S getCopy();
}
Aber wie zhong.j.yu erwähnt dies ist nicht intuitiv und würde immer noch ein BlueStack<T>
von „liegend“ zu verhindern, scheitern und Rückkehr a RedStack<T>
von seiner getCopy
.
Stattdessen empfehle ich ein Redesign. Versuchen Sie, die Verantwortung für das Kopieren von Stapeln vom Typ Stack
selbst zu entkoppeln. Zum Beispiel:
public interface StackCopier<S extends Stack<T>, T extends Item> {
S copy(S original);
}
Wenn Implementierungen von StackCopier
benötigen Zugriff auf private Mitglieder ihrer jeweiligen Stack
s, betrachten sie verschachtelte Klassen, zum Beispiel machen:
class BlueStack<T extends Item> implements Stack<T> {
...
static class Copier<T extends Item> implements StackCopier<BlueStack<T>, T> {
@Override
public BlueStack<T> copy(BlueStack<T> original) {
...
}
}
Natürlich SimpleFinder
werden müssten geändert entweder ein StackCopier<S, T>
Feld oder nehmen Sie einen als neuen Parameter von find
:
private final StackCopier<S, T> copier = ...;
public S find(S stack, int a) {
S stackCopy = copier.copy(stack);
...
return stackCopy;
}
Beste Vorgehensweise, um was zu erreichen? Warum können Sie die Schnittstellendefinitionen nicht ändern? – Bobulous
versuchen Brutecast. Es gibt Möglichkeiten, es zu lösen (rekursiver Typ Parameter), aber es ist es nicht wert. – ZhongYu
@Arkanon weil es nicht meins ist, sich zu ändern ...: | und rohe Besetzung ist ziemlich hässlich, nicht wahr? – SadStudent