2013-06-12 41 views
1

隨着下面的代碼:爲什麼我得到這個錯誤「類型不匹配:不能從Serializable轉換爲T」?

Main.java

// ... 

private static <T extends Serializable> T doStuff() { 
    Response r = ... 

    // ... 

    return r.getDetails();//Error here 
} 

// ... 

Response.java

interface Response { 
    // ... 

    Serializable getDetails(); 

    // ... 
} 

我得到這個編譯錯誤:「類型不匹配:不能從串行化轉換到T「doStuff方法。

如果我投返回的結果,錯誤被消除。

return (T)r.getDetails(); 

但現在我有這樣的警告:Type safety: Unchecked cast from Serializable to T@SuppressWarnings("unchecked")會壓制警告,但我覺得這個解決方案很醜。

有沒有更好的選擇?

+1

返回類型是T不可串行化,這就是問題所在。 – StarPinkER

+0

你確定getDetails()在doStuff()中調用它時總是返回T嗎?如果是,或者你已經完成了類型檢查,那麼你可以抑制警告。 – StarPinkER

回答

1

前提是你給的太少實現細節,我建議做Response通用:

private static <T extends Serializable> T doStuff() { 
    Response<T> r = ...; 

// ... 

    return r.getDetails(); 
} 

interface Response<T extends Serializable> { 
    // ... 

    T getDetails(); 

    // ... 
} 

但不會有必要的,你可能有東西,其餘的工作。問題是Thorsten Dittmar已經寫過的。

1

你要你的返回對象轉換爲T
這樣的:

return (T) r.getDetails(); 

UPDATE

然後,你必須讓你的Response接口或getDetails()方法通用。
這樣的:

interface Response<T extends Serializable> { 
// ... 

T getDetails(); 

} 

interface Response { 
// ... 

<T extends Serializable> T getDetails(); 

} 
+2

我已經張貼我的答案之前,亞歷克斯延長她的問題。 –

0

以下所有的編譯W/O警告,應該給你一個想法:

interface Response<T extends Serializable> { 
    T getResponse(); 
} 


class Sample { 
    private static <T extends Serializable> T get(Response<T> generator) { 
     return generator.getResponse(); 
    } 

    public static void main(String[] args) { 
     System.out.println(get(new Response<Serializable>() { 
      @Override 
      public String getResponse() { 
       return "string"; 
      } 
     })); 
     System.out.println(get(new Response<Serializable>() { 
      @Override 
      public Integer getResponse() { 
       return 1; 
      } 
     })); 
    } 
} 
5

的問題是,你的代碼,每T必須是Serializable,但不是每個Serializable也是T

假設都T1T2Serializable,下面也會導致問題:

T1 t = new T2(); 

T1T2是沒有關係的,即使他們都Serializable

+0

欲瞭解更多信息,你可能想看看維基百科[協變和反變化]頁面(http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)):) – T045T

+0

@ T045T感謝您的鏈接; - ) –

相關問題