目录
泛型介绍
泛型是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
泛型的格式:<数据类型>
注意:泛型只支持引用数据类型
泛型还没出现时,集合是如何存储数据的?
如果我们没有给集合指定类型,集合会默认所有的数据类型都是object类型,在泛型还未出现时也是如此,此时我们可以往集合中添加任意类型的数据。 但这种方式存在一个缺点,即多态的缺点,我们在获取数据的时候,无法使用它自身的特有行为。
泛型的好处
1. 统一数据类型;
2. 把运行时期的问题提前至编译时期,避免了强制类型转换可能出现的异常,因为在编译阶段就能将数据类型确定下来。
泛型的细节
1. 泛型中不能写基本数据类型;
2. 指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型;
3. 如果不写泛型,类型默认是Object类。
泛型类
泛型方法
当方法中形参数据类型不确定时,可以使用泛型方法。
方案1. 使用类名后面定义的泛型(类名后定义的泛型所有方法都能用)
方案2. 在方法声明上定义泛型(在方法上定义的泛型只有该方法自身能用)
// 在类名后定义泛型
public class ArrayList<E>
// 在方法上定义泛型
public <E> boolean add (E e)
泛型接口
//实现类给出具体类型
public class MyArrayList1 implements List<String>
//实现类延续接口的泛型,创建对象时再确定
public class MyArrayList2<E> implements List<E>
继承性
注意:数据具备继承性,但泛型不具备继承性。
代码示例如下。
class Ye {}
class Fu extends Ye {}
class Zi extends Fu {}
public class Test {
public static void main(String[] args) throws ParseException {
ArrayList<Ye> ye = new ArrayList<>();
ArrayList<Fu> fu = new ArrayList<>();
ArrayList<Zi> zi = new ArrayList<>();
method(ye);
method(fu); //报错:泛型不具备继承性
method(zi); //报错:泛型不具备继承性
ye.add(new Ye());
ye.add(new Fu()); //不报错:数据具备继承性
ye.add(new Zi()); //不报错:数据具备继承性
}
public static void method(ArrayList<Ye> list) {}
}
泛型通配符
泛型存在一个弊端,即它可以接受任何类型的数据,如果我们只希望它接受某一类数据时,可以使用通配符。
通配符格式
<? super E>:表示可以传递E或者E的所有父类类型数据
<? extends E>:表示可以传递E或者E的所有子类类型数据
代码示例如下
class Ye {}
class Fu extends Ye {}
class Zi extends Fu {}
public class Test {
public static void main(String[] args) throws ParseException {
ArrayList<Ye> ye = new ArrayList<>();
ArrayList<Fu> fu = new ArrayList<>();
ArrayList<Zi> zi = new ArrayList<>();
method1(ye);
method1(fu);
method1(zi); //报错:zi不是fu的父类
method2(ye); //报错:ye不是fu的子类
method2(fu);
method2(zi);
}
public static void method1(ArrayList<? super Fu> list) {}
public static void method2(ArrayList<? extends Fu> list) {}
}