我有界面:
public interface CartService extends RemoteService{
<T extends ActionResponse> T execute(Action<T> action);
}
我希望在实现中覆盖'execute'方法:
public class XX implements CartService {
@Override
public <GetCartResponse> GetCartResponse execute(GetCart action) {
// TODO Auto-generated method stub
return null;
}
}
但收到编译器错误: 类型XX的execute(GetCart)方法必须覆盖或实现超类型方法
GetCart&amp; GetCartResponse:
public class GetCart implements Action<GetCartResponse>{
}
public class GetCartResponse implements ActionResponse {
private final ArrayList<CartItemRow> items;
public GetCartResponse(ArrayList<CartItemRow> items) {
this.items = items;
}
public ArrayList<CartItemRow> getItems() {
return items;
}
}
如何覆盖此方法?
答案 0 :(得分:2)
问题在于接口的定义与你的impl应该是什么样的。在您的示例中,您有:
<T extends ActionResponse> T execute(Action<T> action);
public <GetCartResponse> GetCartResponse execute(GetCart action);
但根据接口定义,实现方法应为:
public GetCartResponse execute(Action<GetCartResponse> action);
所以我认为您需要更改界面的签名或添加其他类型参数,例如:
public interface CartService extends RemoteService{
<T extends ActionResponse, U extends Action> T execute(U action);
}
或者可能是:
public interface CartService extends RemoteService{
<T extends ActionItem> ActionResponse<T> execute(Action<T> action);
}
答案 1 :(得分:1)
您的接口指定实现类必须为所有T extends ActionResponse
定义该方法。您希望为特定操作和响应定义它们 - 我认为您的界面需要
public interface CartService<T extends ActionResponse, A extends Action<T>>
extends RemoteService {
public T execute(A action)
}
然后实现
public class XX implements CartService<GetCartResponse,GetCart> {
//...
}
如上所述,您可能不需要使用Action
类型的扩展名显式参数化 - 只要您可以处理由Action
参数化的任何类型的GetCartResponse
并且不要不依赖于GetCart
行动的具体细节。在这种情况下,您的界面应该类似于:
public interface CartService<T extends ActionResponse> extends RemoteService {
public T execute(Action<T> action);
}
和实施
public class XX implements CartService<GetCartResponse> {
public GetCartResponse execute(Action<GetCartResponse> action) {
//...
}
}
答案 2 :(得分:0)
使用
public <GetCartResponse extends ActionResponse>
GetCartResponse execute(GetCart action) {
//do stuff
}
作为CartService
中执行方法的签名,它应该可以工作。
我测试了下面的编译;只是将ActionResponse
替换为Integer
,将Action
替换为List
,以方便使用。
CartService:
public interface CartService {
<T extends Integer> T execute(List<T> action);
}
XX
public class XX implements CartService {
public <T extends Integer> T execute(List<T> action) {
throw new UnsupportedOperationException("Not supported yet.");
}
}