java - 从接口(interface)覆盖通用返回类型

标签 java generics interface overriding

我有几个接口(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;
    }
}

或者,如果您只想要 TEndpoint<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/

相关文章:

java - 多目标优化Java

c# - 如何使用我的 List<Type> 中的类型?

performance - 如何让我的 Rust 函数更通用和高效?

java - 使用实现多个接口(interface)预泛型的参数

C++ 界面风格编程。需要一条出路

typescript - 为什么类方法参数可以比接口(interface)参数更窄

C++中抽象类的函数定义

java - Java 命令行中的嵌套系统属性

java - 如何让Tomcat连接到多个数据库?

Java 的模式匹配器表示未找到匹配项,但匹配项已打印到控制台