Si consideri la seguente configurazione:Come sostituire un tipo parametrico con uno più specifico
Abbiamo un'interfaccia SuperType
che viene parametrizzato in questo modo:
public interface SuperType<V> {
}
SuperType
supporta metodo di concatenamento. Quindi definisce un altro parametro di tipo che cattura il sottotipo concreta applicazione restituito da ciascun metodo come questo:
public interface SuperType<V, S extends SuperType<V, S>> {
public S doSomething();
}
Consideriamo un'implementazione di SuperType<V, S extends SuperType<V, S>>
:
public class SubType<V> implements SuperType<V, SubType<V>> {
private final V value;
public SubType(V value) { this.value = value; }
public SubType<V> doSomething() { return this; }
}
Qualcuno istanzia SubType<V>
utilizzando ad esempio stringhe ma fornisce Object
per il parametro di tipo V
:
Object s = "Java Generics";
SubType<Object> x = new SubType<>(s);
Ora vogliamo definire un altro metodo per SuperType<V, S extends SuperType<V, S>>
che prende un parametro di tipo più specifico di V
e restituisce lo stesso tipo di implementazione S
ma ora parametrizzati con W extends V
:
public interface SuperType<V, S extends SuperType<V, S>> {
public S doSomething();
public <W extends V, T extends SuperType<W, T>> T doMoreSpecific(Class<W> typeToken);
}
Questa nuova definizione interfaccia è destinato a sostenere:
Object s = "Java Generics";
SubType<Object> x = new SubType<>(s);
SubType<String> y = x.doMoreSpecific(String.class);
Qui ho difficoltà a implementare SubType<V>
. Quello che voglio fornire come un'implementazione è:
public class SubType<V> implements SuperType<V, SubType<V>> {
private final V value;
public SubType(V value) { this.value = value; }
public SubType<V> doSomething() { return this; };
public <W extends V> SubType<W> doMoreSpecific(Class<W> typeToken) {
return new SubType<>((W) value);
}
}
mia domanda è:
Come devo definire la firma per il metodo doMoreSpecific()
nel tipo SuperType<V, S extends SuperType<V, S>>
in modo che l'applicazione fornita da SubType<V> implements SuperType<V, SubType<V>>
è accettabile?
In caso contrario, quale implementazione e definizione del metodo di interfaccia farebbe il trucco?
Oppure, perché non possiamo farlo in Java?
solo un CommNet, in un'interfaccia, tutti i metodi sono astratti, quindi la definizione esplicita è ridondante –
'S si estende' non è la sintassi valida che rende la vostra domanda difficile da capire ... –
assylias
Spero fissato l'errori di sintassi . Ero pigro per definire tutti i tipi nel mio IDE :). Scusate. – Harmlezz