ho un'interfaccia che assicura oggetti possono effettuare copie di sé:sottoclassi che ereditano interfacce generiche
public interface Duplicable<T extends Duplicable<T>> {
public T duplicate();
}
ora ho
class X implements Duplicable<X>
ma anche un Y classe che estende X.
Questo non è un problema, fino a quando ho bisogno di un altro classe generica:
public class DoStuffWithDuplicable<T extends Duplicable<T>>
non posso usare una versione generica di DoStuffWithDuplicable usando Y, dal momento che non implementa Duplicable<Y>
ma Duplicable<X>
dato che eredita da X.
Così ho provato
public class DoStuffWithDuplicable<T extends Duplicable<? super T>>
.. ma questo mezzo in seguito introducendo un cast pericoloso
(T) obj.duplicate()
nel corpo del codice. Anche i parametri di classe sono più contorti e l'uso della classe più difficile da capire. Qualche idea su come aggirare questo problema?
Puoi riformulare questo: "Non è possibile utilizzare una versione generica del DoStuffWithDuplicable usando Y, dal momento che lo fa non implementare Duplicable ma Duplicable poiché lo eredita da X. " ? – tbsalling
scusa, problema di formattazione – phil
Come nota, questo è esattamente il motivo per cui alcuni scienziati informatici affermano che tutte le classi dovrebbero essere "abstract" o "final". Incontrerai anche problemi con 'equals'; puoi forse fare il refactoring per eliminare l'esistenza di un 'X' istantaneo? – chrylis