2016-07-19 71 views
-1

我有一個接口Int1。我有一個類Cls1實施Int1。和一個通用類Cls2<Cls1>將子類型轉換爲定義爲通用類型的類型

現在我正在寫一個方法:

private void <T extends Int1> test(Cls2<Cls1> arg1) { 
    ... 
    //I try to cast a Cls2<Cls1> into a Cls2<Int1>: it works 
    Cls2<Int1> test1 = (Cls2<Int1>) arg1; 
    //I try to cast a Cls2<Cls1> into a Cls2<T>: doesn't work 
    Cls2<T> test2 = (Cls2<T>) arg1; //compilation error 
} 

考慮到T延伸Int1,有什麼不對的代碼?

+0

「它的作品」,因爲它是多餘的:你不需要爲自己投射一種類型。 –

+0

「編譯錯誤」,因爲'T'並不總是'Cls1';它*可能*是'Cls1',但它也可能是它的一個子類。 –

+1

當方法簽名中沒有使用「T」時,使方法具有通用性(添加'')。 – Andreas

回答

0

以下代碼在intellij中編譯W/O錯誤。

interface Int1{} 
class Cls2<T>{} 
class Cls1 implements Int1 {} 


private <T extends Int1> void test(Cls2<Cls1> arg1) { 
    Cls2<Int1> test1 = (Cls2<Int1>)(Cls2<?>)arg1; 
    Cls2<T> test2 = (Cls2<T>) arg1; 
} 

在java中,由子類和超類參數化的類是不相關的。您需要先投入<?>。總的來說,如果我上面的代碼正確反映了你的代碼,這是一個非常奇怪的泛型使用。請確保您的設計是正確的。

+0

我沒有顯示我的完整用例,但這是因爲方法的返回值是由'T'鍵入的,也是一個參數。在這個方法的某個地方,我獲得了一個類型爲「T」子類型的對象。我不明白爲什麼它返回它是無效的......有沒有辦法做到這一點沒有警告,並沒有壓制警告? – FBB

相關問題