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

Java:强制转换具有类型参数的类,java,casting,Java,Casting,我在第(B)行得到以下代码的编译错误“不可转换类型”。从概念上讲,我认为它应该有效。首先,“适配器”是BasicAdapter类型,BetaAdapter是该类型的一个子类。其次,类型参数BetaData是AlphaData的一个子类 public class Test { class AlphaData {} // base class for data class BetaData extends AlphaData {} // subclass for data class

我在第(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)
  }
}
公共类测试
{
类AlphaData{}//数据的基类
类BetaData扩展了数据的AlphaData{}//子类
类BasicAdapter{}//泛型适配器
类BetaAdapter使用绑定扩展BasicAdapter{}//适配器子类
BasicAdapter适配器=null;//(A)
测试()
{
BetaAdapter ba=(BetaAdapter)适配器;//(B)
}
}
如果我将标有(A)的行更改为

BasicAdapter适配器=null;

它编译。这是有道理的。但我想找出一种方法,使原来的安排起作用。

BasicAdapter您正在指定

BasicAdapter<? extends AlphaData> adapter = null;
class BetaAdapter扩展了BasicAdapter{}

这意味着,BasicAdapter必须是
BasicAdapter
类型。如果尝试将
BasicAdapter
类型转换为
BasicAdapter
,则它将不起作用,因为类型参数必须兼容

下面的代码进行编译并有意义,因为我们接受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)
  }
} 
公共类测试
{
类AlphaData{}//数据的基类
类BetaData扩展了数据的AlphaData{}//子类
类BasicAdapter{}//泛型适配器
//在以下行中所做的更改。。。
类BetaAdapter使用绑定扩展BasicAdapter{}//适配器子类
BasicAdapter适配器=null;//(A)
测试()
{
BetaAdapter ba=(BetaAdapter)适配器;//(B)
}
} 

但是(如果您查看问题中的代码)
类BetaData扩展了AlphaData
already,这将消除我的示例中的编译错误。不过,这对我来说不是一个好的解决方案,因为它会击败BetaAdapter中各种方法中的类型检查。无论如何,谢谢你的主意。你可能想退房。另外,的最上面的答案看起来很相关。或者这个:这个构造确实消除了这个示例中的编译错误。我的真实代码中有一些残余错误,我现在正试图简化这些错误。我意识到我已经实质性地改变了这个问题。因此,我将标记您的答案是否正确,并针对剩余问题提交一个新问题。谢谢
BasicAdapter<? extends AlphaData> adapter = new BetaAdapter(); 
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)
  }
}