1.泛型(jdk1.5以后出现)
https://www.cnblogs.com/lwbqqyumidi/p/3837629.html#!comments
(1)为什么要用泛型?
限制集合,让它只能存储某种类型的元素,如果不限制,集合(默认Object类型)中想存什么就存什么,这样在取元素的时候就会面临大量强制类型转换,这就很可能出现转换异常,为了解决这个问题,jdk1.5以后就出现泛型
当我们将一个对象放入集合中,集合不会记住此对象的类型,当再次从集合中取出此对象时,改对象的编译类型变成了Object类型,但其运行时类型任然为其本身类型。因此,当我们取出集合元素时需要人为的强制类型转化到具体的目标类型,这就很容易很容易出现“java.lang.ClassCastException”异常
(2)泛型概述
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变化量话参数,此时类型也定义成参数形式(可称之为类型形参),然后在使用/调用时传入具体的类型(类型实参),一般用"<E>"表示。泛型只在编译时有效,在生成的.class文件中,会把泛型擦除掉。
(3)泛型定义
a 定义在类上
若类在定义时没有加泛型时,则在创建对象时,不能使用泛型,如下图
此时Box定义时加上泛型,如下
public class GenericDemo { public static void main(String[] args) { Box<Integer> box = new Box<>(2); //右边的尖括号内不需要写具体的可类型,jdk.7以后会根据左边自动识别出类型是什么 } } class Box<T>{ T t; // T的类型是什么由创建对象时确定,如此处T就是Integer类型 public Box(T t) { this.t = t; } public T getT() { return t; } }
注意,类在创建对象时,不加泛型,默认是Object类型
b 定义在方法上(不常用)