List<Interger>是List<Number>的子类吗?

        在回答这个问题之前,我们先探究一下另外一个问题:Interger[]数组可以给Number[]数组赋值吗?先看下面这段代码:

public class ArrayErr
{
	public static void main(String[] args)
	{
		// 定义一个Integer数组
		Integer[] ia = new Integer[5];
		// 可以把一个Integer[]数组赋给Number[]变量
		Number[] na = ia;
		// 下面代码编译正常,但运行时会引发ArrayStoreException异常
		// 因为0.5并不是Integer
		na[0] = 0.5;   // ①
	}
}

        上面代码可以编译通过,但运行会报下面错误:

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Double
 at ArrayErr.main(ArrayErr.java:13)

        这是一种潜在的风险。在Java的早期设计中,允许Interger[]数组赋值给Number[]数组,这一设计理念是存在缺陷的。一门设计优秀的语言,不仅需要提供强大的功能,而且能提供强大的“错误提示”和“出错警告”,这样才能尽量避免开发者犯错。而Java允许Integer[]数组赋值给Number[]显然不是一种安全的设计。

        Java泛型的设计原则是,只要代码在编译时没有出现警告,就不会遇到运行时ClassCastException异常。依据这一设计原则,泛型不认为List<Interger>是List<Number>的子类。下面两行代码证明了这一点。

 

		List<Integer> iList = new ArrayList<>();
		// 下面代码导致编译错误
		List<Number> nList = iList;

        另外我们可以得出更为广义的一个结论:假设Foo是Bar的一个子类型(子类或子接口),那么Foo[]依然是Bar[]的子类型,但G<Foo>不是G<Bar>的子类型。  

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值