繁体   English   中英

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

[英]Java: casting a class having a type parameter

我在第(B)行得到了以下代码的编译错误“不可转换的类型”。 从概念上讲,我认为它应该有效。 首先,“adapter”是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;

它汇编。 那讲得通。 但我想找出一种方法来使原始安排工作。

BasicAdapter<? extends AlphaData> adapter = null;

会工作(或至少编译)。 它兼容

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

你指的是那个

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)
  }
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM