从接口覆盖泛型返回类型

Ind*_*ity 8 java generics 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);
}
Run Code Online (Sandbox Code Playgroud)

对于实现的类Fetcher,为什么编译器使用此方法声明:

public FetchableImpl fetch(Endpoint endpoint) { return null;}
Run Code Online (Sandbox Code Playgroud)

虽然这些都是不正确的声明:

public FetchableImpl fetch(EndpointImpl endpoint) { return null;}
--or--
public FetchableImpl fetch(Endpoint<FetchableImpl> endpoint) { return null;}
Run Code Online (Sandbox Code Playgroud)

哪里EndpointImpl implements Endpoint<FetchableImpl>.

我的直觉是,参数会指定它是一个处理特定类型的Fetchable的端点.那么为什么编译器只需要一个直接的Endpoint,即使接口方法需要Endpoint<T>

Rob*_*sen 0

您的接口方法声明需要一个能够处理任何类型的方法EndPoint

public <T extends Fetchable> T fetch(Endpoint<T> endpoint);
Run Code Online (Sandbox Code Playgroud)

但在您的方法实现中,您将其范围缩小到更具体的EndPoint.

public FetchableImpl fetch(EndpointImpl endpoint) { return null;}
public FetchableImpl fetch(Endpoint<FetchableImpl> endpoint) { return null;}
Run Code Online (Sandbox Code Playgroud)

因此,这些不是接口方法的有效实现。它们没有涵盖接口所需的所有情况。

您可能想要声明一个 generic 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您只希望Tin与方法返回的Endpoint<T>相同T,您可以保持接口方法声明不变,并在实现类中使用相同的声明:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)