[英]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.