2016-02-26 52 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 .. –