2012-12-12 58 views
0

以下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延伸的类型的ServerDataObject ProxyDataObject

这并未”对我来说没有意义。

+0

对不起还有另一个ServerDataObject –

+2

哪一行是引用的错误? – amit

回答

1

doClassClass<DO>类型,所以doClass.newInstance()的类型为DO。你怎么能把这个投到ProxyDataObject<DO>

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。因此你会看到你所看到的错误。