2016-02-26 82 views
1

下面的代碼在行(B)處出現編譯錯誤「inconvertible types」。從概念上講,我認爲它應該起作用。首先,「adapter」是BasicAdapter類型的,而BetaAdapter是它的一個子類。其次,類型參數BetaData是AlphaData的一個子類。Java:鑄造一個具有類型參數的類

public class Test 
{ 
    class AlphaData {} // base class for data 

    class BetaData extends AlphaData {} // subclass for data 

    class BasicAdapter<T> {} // a generic adapter 

    class BetaAdapter extends BasicAdapter<BetaData> {} // adapter subclass with binding 


    BasicAdapter<AlphaData> adapter = null; //(A) 

    Test() 
    { 
    BetaAdapter ba = (BetaAdapter) adapter; //(B) 
    } 
} 

如果我改變標記(A)的線

BasicAdapter<BetaData> adapter = null; 

它編譯。這就說得通了。但我想找出一種方法來使原來的安排工作。

+0

你可能想看看[這個問題](http://stackoverflow.com/questions/18666710/why-are-arrays-covariant-but-generics-are-invariant)。此外,[這個問題]的最佳答案(http://stackoverflow.com/questions/2660827/java-generics-covariance)看起來相關。 – ajb

+0

或這一個:http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-p?lq=1 – Thilo

回答

3
BasicAdapter<? extends AlphaData> adapter = null; 

將工作(或編譯至少)。而且它與

BasicAdapter<? extends AlphaData> adapter = new BetaAdapter(); 
+0

這個構造的確的確的確如此,消除這個例子的編譯錯誤。我在我真正的代碼中存在一些剩餘的錯誤,現在我正試圖簡化它。 –

+0

我意識到我已經大大改變了這個問題。所以我正確地標記你的答案並提出一個新的問題來解決剩餘問題。謝謝。 –

0

你指定

class BetaAdapter extends BasicAdapter<BetaData> {}

這意味着,BasicAdapter必須BasicAdapter<BetaData>類型的,如果你試圖強制轉換BasicAdapter<AlphaData>BasicAdapter<BetaData>那麼它將無法工作兼容,因爲類型參數必須兼容。

以下代碼編譯並且有意義,因爲我們接受BetaAdapter類中的所有AlphaData類作爲類型參數。

public class Test 
{ 
    class AlphaData {} // base class for data 

    class BetaData extends AlphaData {} // subclass for data 

    class BasicAdapter<T> {} // a generic adapter 

//changes made in following line... 
    class BetaAdapter extends BasicAdapter<AlphaData> {} // adapter subclass with binding 


    BasicAdapter<AlphaData> adapter = null; //(A) 

    Test() 
    { 
    BetaAdapter ba = (BetaAdapter) adapter; //(B) 
    } 
} 
+0

是的..我不確定。:)我會改變它 –

+0

,但(如果你看問題中的代碼)'類BetaData擴展AlphaData'已經 – Thilo

+0

我認爲它的問題,因爲你不能將AlphaData轉換爲BetaData .. –