Ho diverse interfacce:Override tipo restituito generico dall'interfaccia
public interface Endpoint<T extends Fetchable> {
public Class<T> getFetchableType();
}
public interface Fetchable {
... fetched data fields
}
public interface Fetcher {
public <T extends Fetchable> T fetch(Endpoint<T> endpoint);
}
Per una classe che implementa Fetcher
, perché fa il lavoro del compilatore con questa dichiarazione di metodo:
public FetchableImpl fetch(Endpoint endpoint) { return null;}
mentre questi sono entrambi errati dichiarazioni:
public FetchableImpl fetch(EndpointImpl endpoint) { return null;}
--or--
public FetchableImpl fetch(Endpoint<FetchableImpl> endpoint) { return null;}
dove EndpointImpl implements Endpoint<FetchableImpl>
.
La mia intuizione sarebbe che il parametro avrebbe qualcosa di designante che è un endpoint che si occupa del tipo specifico di Fetchable. Quindi, perché il compilatore richiede solo una scala Endpoint
, anche quando il metodo di interfaccia richiede Endpoint<T>
?
Quindi, se volessi che il 'T' in 'Endpoint' sia uguale al 'T' che viene restituito dal metodo, come dovrei dichiararlo nell'interfaccia? –
Indigenuity
Lo stesso di voi. E usa la stessa dichiarazione anche nella tua classe di implementazione, inclusi i parametri del tipo. –
Questo non sembra spiegare perché è consentito il primo metodo? Quando l'interfaccia si aspetta di restituire qualsiasi cosa che estenda Fetchable, la classe restituisce effettivamente una classe specifica. – Codebender