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

来源:互联网 发布:嵌入式与人工智能关系 编辑:程序博客网 时间:2024/05/22 11:50

        在回答这个问题之前,我们先探究一下另外一个问题: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并不是Integerna[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 0
原创粉丝点击