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
- List<Interger>是List<Number>的子类吗?
- List<T>排序
- 【泛型】使用List<T>篇
- json转换成list<T>
- C# List<>简单用法
- 如何正确使用List<?>
- List<T>的搜索和排序
- list<object> 与List<Sting[]>打回前台
- ><
- <<如果哲学家是程序员(英文)>>转载
- 泛型List<T>与非泛型ArrayList
- C#中DataTable转化为List<T>解析
- hql语句查询返回List<Map>
- 数组、ArrayList、List<T>区别和选择
- How to cast List<Object> to List<MyClass> Object集合转换成实体集合
- <<转>>算法的力量(李开复)
- 逻辑运算符<<和>>的详细分析
- <字符串的应用>
- C# WPF 利用NPOI读写Excel文件。
- 6个用于大数据分析的最好工具
- 需要学习的内容--长期出入库
- 泛型的引入
- 泛型的深入研究
- List<Interger>是List<Number>的子类吗?
- 如何正确使用List<?>
- 循序渐进理解泛型的通配符
- 泛型方法的使用
- 【PHP7内核剖析】3.4 面向对象-对象的实现
- Lambda表达式的引入
- Android系统服务-WindowManager
- Google Analytics站内搜索分析思路与方法(基础篇)
- 异常机制概述