Java:转换具有类型参数的类

时间:2016-02-26 06:49:20

标签: java casting

我收到编译错误"不可转换的类型"对于(B)行的以下代码。从概念上讲,我认为它应该有效。首先,"适配器"是BasicAdapter类型,BetaAdapter是它的子类。其次,类型参数BetaData是AlphaData的子类。

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;

它编译。那讲得通。但我想找出一种方法来使原始安排有效。

2 个答案:

答案 0 :(得分:3)

BasicAdapter<? extends AlphaData> adapter = null;

可以工作(或至少编译)。它与

兼容
BasicAdapter<? extends AlphaData> adapter = new BetaAdapter(); 

答案 1 :(得分:0)

您正在指定

class BetaAdapter extends BasicAdapter<BetaData> {}

这意味着,如果您尝试将BasicAdapter<BetaData>强制转换为BasicAdapter<AlphaData>,则BasicAdapter必须是BasicAdapter<BetaData>类型,然后它才会起作用,因为Type参数必须兼容。

以下代码编译并且有意义,因为我们接受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)
  }
}