我有几个接口(interface):
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
, 即使接口(interface)方法需要 Endpoint<T>
?
最佳答案
您的接口(interface)方法声明需要一个能够处理任何类型的 EndPoint
的方法。 :
public <T extends Fetchable> T fetch(Endpoint<T> endpoint);
但是在您的方法实现中,您将其缩小到更具体的类型 EndPoint
.
public FetchableImpl fetch(EndpointImpl endpoint) { return null;}
public FetchableImpl fetch(Endpoint<FetchableImpl> endpoint) { return null;}
因此,这些不是接口(interface)方法的有效实现。它们并未涵盖接口(interface)需要的所有情况。
您可能想要声明一个通用的 Fetcher
,然后实现:
public interface Fetcher<T extends Fetchable> {
T fetch(Endpoint<T> endpoint);
}
public class FetcherImpl implements Fetcher<FetchableImpl> {
public FetchableImpl fetch(Endpoint<FetchableImpl> endpoint) {
return null;
}
}
或者,如果您只想要 T
在Endpoint<T>
与 T
相同由方法返回,您可以保持接口(interface)方法声明不变,并在您的实现类中使用相同的声明:
public interface Fetcher {
<T extends Fetchable> T fetch(Endpoint<T> endpoint);
}
public class FetcherImpl implements Fetcher {
public <T extends Fetchable> T fetch(Endpoint<T> endpoint) {
return null;
}
}
关于java - 从接口(interface)覆盖通用返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31869664/