从java1.5发行版本开始,java就提供了一种安全的替代方法,称作无限制的通配符类型,如果要使用范型,但是确定或者不关心实际的参数类型,就可以用一个问号代替。例如范型Set的无限制通配符类型为Set。这是最普通的参数化Set类型,可以持有任何集合。
关于Set的两个事实: 1、因为“?”标记可以代表任何类型,Set可以持有任何类型的元素 2、由于不知道“?”代表的类型,所有我们不能把任何元素放到Set集合中
由于可以将任何元素放进使用原生态类型的集合中,因此很容易破坏该集合的类型约束条件;但不能将任何元素(除了null之外)放到Collection中。
“不要在新代码中使用原生态类型”,这条规则有两个例外,这是因为“泛型信息在运行时就会被擦除”。
在获取类信息中必须使用原生态类型(数组类型和基本类型也算原生态类型),规范不允许使用参数化类型。换句话说:List.class,String[].class和int.class都是合法,但是List.class和List.class都是不合法的。
这条规则的第二个例外与instanceof操作符有关,由于泛型信息在运行时已被擦除,因此在参数化类型而不是无限制通配符类型(如List)上使用instanceof操作符是非法的,用无限制通配符类型代替原生态类型,对instanceof操作的行为不产生任何影响。在这种情况下,尖括号和问号?就显得多余了。
下面是利用泛型来使用instanceof操作符的首先方法:
if(o instanceof set){
Set m = (Set)o;
// ...
}
注意,一旦确定这个o是个Set,就必须将它转换成通配类型Set,则不是转换成原生态类型Set,否则Set会引起编译时警告。
总之,使用原生态类型会在运行时导致异常,因此不要在新代码中使用。原生态类型只为了与引入泛型之前的遗留代码进行兼容和互用而提供的。另外Set是个参数化类型,表示可以包括任何对象类型的一个集合;Set则是一个通配符类型,表示只能包含某种未知对象类型的一个集合;Set则是个原生态类型,它脱离了泛型系统。前两者是安全的,最后一种不安全。
术语介绍: 原生态类型:List 参数化的类型:List 泛型:List 有限制类型参数:List 形式类型参数:E 无限制通配符类型:List 有限制通配符类型:List
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?