2011-11-07 22 views
2

如果有一個通用型兒童類不能被轉換爲普通父

class A<T> { ... } 
class B extends A<Qux> { ... } 
class C extends B { ...} 

到目前爲止好開始了類型層次。現在我有一個使用的參數不同的類(也是通用):

class Foo<T> extends Bar<T> { 
    setA(A<T> a){ ...} 
} 

現在我想用這一切:

Foo<Qux> foo = new Foo<Qux>(); 
foo.setA(new C()); 

最後一行給出一個錯誤「組A型美孚不適用於參數C「。

我無法弄清楚什麼是錯的。在我看來,它應該工作,因爲C擴展了B,擴展了A,這是應該使用的參數類型...感謝任何提示我的假設有什麼問題。

更新:使用Oli公佈的代碼,我設法更接近錯誤的來源。一旦我用原來的課程取代B,就會發生這種情況。所以它必須位於不使用「通用」部分的類中。在試圖轉換到父類時,Eclipse說它不能。我將繼續尋找在那裏,我知道這應該是工作......這個問題可以減少到這一點:

C c = new C(); 
A<Qux> a = (A<Qux>)c; 

在我的代碼,這導致錯誤

Cannot cast from C to A<Qux> 

我仍然沒有爲什麼會發生這種情況爲什麼不能將子類轉換爲父類?沒有這樣的理由。因爲如果你有這樣的問題,它可能只是你的IDE。我由於其他原因重新啓動Eclipse,再次檢查並且它工作正常。

+0

我沒有看到你提到的錯誤(在你的代碼中,我假設'setA'在上面聲明的'foo'實例上被調用)。 –

+0

thx提示電話 – Yashima

+0

我仍在尋找......用我的課程填寫他的代碼,以弄清楚會發生什麼。我會盡快更新問題 – Yashima

回答

3

以下爲我編譯罰款:

public class Test { 

    static class Qux {}; 

    static class A<T> {} 
    static class B extends A<Qux> {} 
    static class C extends B {} 

    static class Bar<T> {} 
    static class Foo<T> extends Bar<T> { 
     void setA(A<T> a) {} 
    } 


    public static void main(String[] args) { 
     Foo<Qux> foo = new Foo<Qux>(); 
     foo.setA(new C()); 

     // From question update 
     C c = new C(); 
     A<Qux> a = c; 
    } 
} 

你的問題必須在別處。

+0

哦,無論如何感謝代碼,我會嘗試爲實際的課程設置此測試,也許我犯了一個錯誤在寫這個問題。 – Yashima

+0

感謝您向我展示如何測試它應該工作的幫助。事實證明,它重新編譯Eclipse之後:(我不確定這個問題現在值得保留,因爲原來的問題根本不存在。 – Yashima