泛型的引入
泛型引入前后代码的比较
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
标签:15,generic,arrayList,Dog,add,arrayList1,泛型,new From: https://www.cnblogs.com/gknives/p/18432993