Java- 泛型
参考文章:https://juejin.cn/post/6844903925666021389
1. 泛型概述
1.1 什么是泛型
-
Java泛型(generics)是JDK 5中引入的一个新特性,在很大的程度上方便在集合上的使用。
-
泛型的本质是 参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了
1.2 泛型的目的
- 泛型的出现避免了强转的操作,在编译器完成类型转化,也就避免了运行的错误。
1.3 <泛型使用例子>:
注意:只能是引用类型
Person<String> person = new Person<>("字符串");
Person<Integer> person1 = new Person<Integer>(2);
Person<Person> person2 = new Person<>(person);
class Person<E>{
E s;
public Person(E s) {
this.s = s;
}
}
正常写 List list = new ArrayList();
时,默认给它的泛型是 Object。
2. 泛型的使用
泛型有三种常用的使用方式:泛型类,泛型接口和泛型方法。
2.1 泛型类
class Person<E>{//如果创建对象时没有指定类型,默认是 Object
E s;
public Person(E s) {
this.s = s;
}
}
这样定义的类就是一个自定义泛型类,其他的泛型类就是那些容器类,如List,Set等。
注意事项:由于使用自定义泛型的类,只有在实例化的时候才知道这个类型参数是什么,所以导致(1)使用泛型的数组不能初始化;(2)静态方法和静态属性并不能使用泛型。
2.2 泛型接口
public interface Test_ <E>{
//...
}
注意:泛型接口的类型,在继承接口 或者 实现接口时确定。(默认Object)
2.3 泛型方法
public <E,W> void Come(E e){
//...
}
注意:“泛型方法”和“方法使用泛型”并不是同一回事!
3. 泛型的继承 和 通配符
-
泛型不具备继承性。
List<Object> list = new ArrayList<String>();【错误】 -
<?>:支持任意泛型类型。
-
<? extends A>:支持A类以及A类的子类,规定了泛型的上限。
-
<? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限。