泛型
泛型:
集合中存储了不同类型的对象,取出时,容易在运行时时期发生ClassCastException类型转换异常。
为了避免这个问题的发生。
如果在存储的时候就明确了集合要操作的数据类型,这样取出就没有问题了
就需要在定义集合时,就立刻明确元素的类型。
其实借鉴于数组。
可以通过<>来明确元素的类型。
泛型的好处:
1,将运行时期出现的ClassCastException问题,转移到了编译时期。
2,避免了强制转换的麻烦。
泛型其实是JDK1.5版本以后出现的一个安全机制。
泛型其实给编译器使用的。
泛型的表现形式就是<>
编码时,什么时候使用泛型呢?
只要用到的类或者接口的旁边有<>时,就要明确具体类型。
泛型的使用其实就是 给<>传递实际参数,而这个参数就是一个具体引用数据类型。
什么时候使用泛型类呢?
当类要操作的引用数据类型不确定的时候,可以使用泛型来定义,
也就是定义一个类型参数。
具体要操作什么类型的对象,有使用该类的使用者来明确,将具体的类型做为实际参数传递给<>.
当泛型定义在类上。该泛型作用于整个类。
当该建立对象时,就明确了具体类型。
那么凡是使用了类上定义的泛型的方法,操作的类也就固定了。
可以将泛型定义在方法上。
泛型方法。
当类中定义static方法时,静态方法是不可以直接方位类上的泛型,
因为类上的泛型只有通过建立对象才可以明确具体类型。
所以静态方法如果操作的引用数据类型不确定,只能将泛型定义在方法上。
在静态方法上定义泛型,必须定义在static关键字之后。
当方法中操作的应用数据类型不确定,而且和对应的对象执行的类型也不一定一致。
这时就将泛型定义在方法上。
泛型:通配符:? 代表任意类型。
定义集合要保证左右两边的类型一致。
//两边只有一边定义泛型,也是可以支持,至少新老版本兼容。但是一样会出现,安全提示信息。
泛型的限定:
? extends E:接收E类型或者E的子类型。
?super E:接收E类型或者E的父类型。