一、泛型的简单介绍(Generic)
1.诞生的意义
为什么出现?顺序表本身是一种抽象数据类型,保存的数据不只是int型。如果没有泛型的支持,我们必须为每一种要保存的类型定义一个顺序表类。
为了解决此问题:
第一阶段:思考
(1)Object 是所有类的基类
class ArrayList{ Object[ ] array; int size; }
元素类型:Object类类型的引用。Object引用可以指向任意类的对象
(2)多态:基类的引用可以指向任何子类的对象
第二阶段:引出了新的问题
写代码时必须一直记着顺序表中的元素类型,否则就会出现运行时异常:
ClassCastException //Object[];
ArrayList List = new ArrayList();
class Person{} list.add(new Person());
String o=(String)list.get(0);
泛型产生
2.泛型的三种用途:
(1)泛型接口
(2)泛型类
(3)泛型方法
二、泛型出现的原因
1.为了解决类似顺序表这样的结构,支持通用类型元素类型
2.Object
(1)Object 是所有类的基类
(2)基类的引用可以指向任何对
class ArrayList{ Object[] array; int size; }
3.这种解决方案,无法在编译期间快速找出问题
ArrayList list=new ArrayList();
list.add(new Person());
String s=(String)list.get(0);
//list 第0个下标处,实际的对象类型是Person
//String 引用无法指向这个对象
//运行期间会抛出异常 ClassCastException
*前提:错误越早发现越好
(1)写代码时 IDEA 用~提示错误
(2)编译期间 javac报错
(3)运行期间去报错
4.为了让错误尽可能在编译期间出现,引入了泛型
三、泛型的语法
1.定义泛型类
class ArrayLIst<类型变量形参 Type Variable Paramter>{ }
class ArrayList{ E[] array; int size; }
2.使用泛型
new ArrayList<String>();
2.1嵌套
ArrayList<String> p=....;
ArrayList<> q=...; //q的元素类型期望是 ArrayList<String><>
ArrayList<ArrayList<String>> q;
Set<Map.Entry<String,String>>
2.2类型推导 Type Inferer
ArrayList<String> p = new ArrayList{};
2.3多类型参数
Map<String,Integer>成绩;
例子:ArrayList<Person>p=new ArrayList<>();
p.add(new Preson());
String s =(String)p.get(0); //这里编译错误
*3.泛型是编译期间的魔法。类的字节码中就没有泛型了,运行期间更没有