gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:50:11 25 4
gpt4 key购买 nike

如何实现 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 类型的新变量(无论如何都不能没有一些未经检查的强制转换)。您可能需要 action 类有一种方法可以为您提供一个 Response 实例,您可以从 execute 中返回该实例。像这样的东西:
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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com