java - 在实现具有有界返回类型的接口(interface)时避免编译器警告

标签 java generics

如何实现 ContactService 接口(interface),而不收到编译器未经检查的转换的警告:

interface ContactsService
{
    <T extends Response> T execute(Action<T> action);
}

interface Action<T extends Response> { }

interface Response{ }

class GetDetailsResponse implements Response {}

如果我返回 GetDetailsResponse 的实例,则会收到警告: 未经检查的覆盖:返回类型需要未经检查的转换

这是来自 google io 上的 gwt 最佳实践演示的示例。

最佳答案

我猜你尝试过类似的操作:

class MyService implements ContactsService {
    @Override
    public <T extends Response> T execute(Action<T> action) {
        return (T)new GetDetailsResponse();
    }
}

问题是我可能有另一个实现 Response 的类 MyResponse。然后我可以调用:

Action<MyResponse> action = new Action<MyResponse>();
// you can't actually instantiate an interface, just an example
// the action should be some instance of a class implementing Action<MyResponse>
MyReponse r = myService.execute(action);

但是execute方法返回一个GetDetailsResponse的实例,它与MyReponse不兼容。您需要返回类型 T,该类型由您传递给执行的操作指定。

据我所知,您无法在执行中实例化 T 类型的新变量(无论如何,也不能没有一些未经检查的强制转换)。您可能需要操作类能够为您提供可以从执行中返回的 Response 实例。像这样的事情:

interface Response {
    void setWhatever(String value);
}

interface Action<T extends Response> {
    T getResponse();
}

class MyAction implements Action<GetDetailsResponse> {
    @Override
    public GetDetailsResponse getResponse() {
        return new GetDetailsResponse();
    }
}

class MyService implements ContactsService {
    @Override
    public <T extends Response> T execute(Action<T> action) {
        T response = action.getResponse();
        // do something to Response here like
        response.setWhatever("some value");
        return response;
    }
}

关于java - 在实现具有有界返回类型的接口(interface)时避免编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3245012/

相关文章:

Java/返回动态对象类型

java - 创建泛型类以传递泛型类型(对象或列表)

java - 如何强制用户输入带有符号的密码?

Java EE RESTful Web 服务安全 w/HMAC 如何拦截请求?

java - 未经其他人许可使用文件数据

scala - 如何为 Scala 中的任何集合创建一个通用的隐式类?

java - 如何使用 Class.forName 的结果创建泛型类的实例

java - 如何更改打开对话框的图像以及如何在swing中自定义对话框?

c# - 检索关闭泛型类型的泛型类型的未封闭类型

Java重写抽象泛型方法