Java泛型方法覆盖

时间:2010-05-05 13:19:08

标签: java generics

我有界面:

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;
    }

}

如何覆盖此方法?

3 个答案:

答案 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.");
    }
}