泛型的引入
泛型引入前后代码的比较
public static void main(String[] args) {ArrayList arrayList = new ArrayList();arrayList.add(new Dog("wang",10));arrayList.add(new Dog("xin",1));arrayList.add(new Dog("ran",5));//遍历for (Object o :arrayList) {//需要向下转型Dog dog = (Dog) o;System.out.println(dog.getName());}//表示存放到该集合中的元素只能是DOG类型或者其子类型//如果编译器发现不满足要求就会报错ArrayList<Dog> arrayList1 = new ArrayList<Dog>();arrayList1.add(new Dog("wang",10));arrayList1.add(new Dog("xin",1));arrayList1.add(new Dog("ran",5));//遍历时候可以直接取出DOG类型而非OBJECT//因为编译器明白,一定能取出DOG类for (Dog dog : arrayList1) {System.out.println(dog.getName());}}
}
泛型介绍
泛型是一种可以表示(接收)数据类型的数据类型。
class Person3<E>{//属性的类型是在创建或者定义PERSON时去指定一个//或者是某个方法的返回值类型,参数类型E s;public Person3(E s){this.s = s;}public E f(){return s;}public void t(){//此处的显示是变化的,E可以表示数据类型的一种System.out.println(s.getClass());}
}
泛型的语法
泛型的使用细节
自定义泛型
自己写了个类或者接口,然后自己规定泛型,C++中的模板。
静态方法是和对象没有关系的,所以无法判断泛型是什么类型。
所以静态数据成员和静态成员方法都不可以用泛型。
在类加载时对象还没有创建。
JVM无法完成初始化。
使用泛型的数组不可以初始化,如下:
及不可以直接实例化。
创建对象时不指定泛型类型是OK的,不一定非要<>才可以构建。但是此时所有泛型全都指定为OBJECT。
如上,接口中定义的成员不能使用泛型.
继承接口时:
当调用方法时,传入参数,编译器就会确定类型。(直接往里面传参数就OK了)
方法分为泛型方法(必须新自定义泛型),和仅仅使用了泛型的方法。
泛型的继承和通配符
图片中的第一条代码是不允许的,因为泛型不具有继承性。
通配符用于定义了泛型的类作为参数时,比如系统定义或者自定义,规定了接收使用了何种泛型的类,如下图:
JUNIT
在方法上方@Test alt + enter,一般是在JUNIT5.4