У меня есть несколько интерфейсов:Перекрытие общего типа возвращаемых из интерфейса
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);
}
Для класса, который реализует Fetcher
, почему делает работу компилятора с этим методом декларацией:
public FetchableImpl fetch(Endpoint endpoint) { return null;}
в то время как они оба неправильно декларации:
public FetchableImpl fetch(EndpointImpl endpoint) { return null;}
--or--
public FetchableImpl fetch(Endpoint<FetchableImpl> endpoint) { return null;}
, где EndpointImpl implements Endpoint<FetchableImpl>
,
Моей интуицией было бы то, что у параметра будет что-то обозначающее, что это конечная точка, которая имеет дело с конкретным типом Fetchable. Итак, почему компилятор требует только прямой Endpoint
, даже если для метода интерфейса требуется Endpoint<T>
?
Так что, если бы я хотел, чтобы 'T' в' Endpoint 'был таким же, как' T', который возвращается методом, как бы объявить это в интерфейсе? –
Indigenuity
То же, что и у вас. И используйте одно и то же объявление в своем классе реализации, включая параметры типа. –
Это, похоже, не объясняет, почему разрешен первый метод? Когда интерфейс ожидает вернуть все, что расширяет Fetchable, класс фактически возвращает определенный класс. – Codebender