通用方法,泛型返回类型不匹配

时间:2012-12-12 08:51:33

标签: java generics

以下Java代码无法编译。

public <DO extends ServerDataObject> ProxyDataObject<DO> convertToProxy(Class<DO>   doClass) throws Exception{
    if(getId()==0)return null;
    ProxyDataObject<DO> proxy = (ProxyDataObject<DO>) doClass.newInstance();
    proxy.setID(getId());
    return proxy;
}

public interface ProxyDataObject<DO extends ServerDataObject> extends ServerDataObject, DataTransferInterface {

public void setID(int id);

@Ignore
public String getIDName();
}

给出以下信息:

  

绑定不匹配:DO类型不是有界参数的有效替代DO扩展了ProxyDataObject类型的ServerDataObject

这对我没有意义。

2 个答案:

答案 0 :(得分:1)

doClassClass<DO>类型,因此doClass.newInstance()的类型为DO。你怎么可能把它投到ProxyDataObject<DO>

答案 1 :(得分:0)

奇怪。使用Java 1.6.0_26为我编译好,尽管有警告。

第一个问题是您的方法签名应该是:

public <DO extends ServerDataObject> ProxyDataObject<DO> convertToProxy(
        Class<? extends ProxyDataObject<DO>> doClass
    ) throws Exception {
    if(getId()==0)return null;
    ProxyDataObject<DO> proxy = doClass.newInstance();
    proxy.setID(getId());
    return proxy;
}

或:

public <DO extends ProxyDataObject<?>> DO convertToProxy(Class<DO> doClass) throws Exception{
    if(getId()==0)return null;
    DO proxy = doClass.newInstance();
    proxy.setID(getId());
    return proxy;
}

取决于你的实际意思。

其次,DO扩展ServerDataObject,而不是ProxyDataObject。使用您定义的继承,ServerDataObject的实例可能不是ProxyDataObject。因此,您会收到您所看到的错误。