1.定义一个泛型类
1.1.实现一个顺序表的泛型类
定义语法:
class 类名称<类型形参>{} //定义语法
public class MyArrayList<E> implements list<E>;
//第一个E是形参,第二个E是实参
1.2.数组类型或者引用类型记得置空
否则会引发内存泄漏,即原本语义上应该死去(最后被回收)的对象因为
1.3泛型的类型擦除问题
1.已知泛型是在工作在编译期间的一种机制
2.编译器(javac)在编译器期间,将E变换一种具体的类型——类型擦除
MyArrayList<E> => Object
MyArrayList<E extends Object> //extends是在定义中的
了解:3.定义的边界问题
class MyArrayLsit <E extends Integer>{
}
//E只能接受Integer 类型子类型(包括Integer 本身)
4.泛型(Raw Type)
MyArrayList<String>
MyArrayList<Double>
MyArrrayList<>
MyArrayList //原始类型
5.泛型的父类和子类的问题
MyArrayList<Object>
MyArrayList<Integer>
MyArrayLAist<Number>
//泛型参数没有上下级关系,不可调用
void print(ArrrayList<Object>list){}
print(new MyArrayList<Object>(Object)) //正确
print(new MyArrayList<Number>(Number)) //错误
print(new MyArrayList<Integer>(Integer)) //错误
6.泛型用在使用泛型类(泛型方法中)通配符
MyArrayList<?>list; //通配符 即为Object(最大的)
list = objectList;
list = integerList;
MyArrayList<Integer> //可认为是通配符的子类型
MyArrayList<Object> //不可认为是子类型
通配符的上下界(使用)
MyArrayList<? extends Integer>list; //上界(extends是在使用中的)
MyArrayList<? super Integer>list; //下界
6.泛型总结
1.掌握泛型类的使用
2.了解泛型方法的使用:用来实现任意类型
3.掌握泛型是编译期间的机制,和运行时无关
1.有类型擦除问题
2.无法使用 list instanceof List<Integer>
4.定义泛型类
1.了解什么类型形参(paramater),什么是类型实参(argument)
2.class ArrayList(....) //决定了类型擦除的边界
5.使用
1.ArrayList<Object> 不是 ArrayList<Integer> 的祖先类型
2.ArrayLsit<?> 是 ArrayList<Integer> 的祖先类型