2012-12-12 169 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。因此你會看到你所看到的錯誤。