泛型:
概述:泛指某种类型。
好处:
1、提高安全性。(把运行期异常转移到编译期)
2、不用强转了。
泛型的格式:
<> <>中的数据类型必须是引用类型
注意事项:
1、前后泛型必须一致,或者后边的泛型可以不写。
ArrayList<String> list = new ArrayList<String>();
案例:ArrayList存储字符串、自定义对象并遍历(泛型版)
泛型的由来:
以前的集合能存的是Object类型的数据,这样什么类型的数据都可以存进集合了。
但是好多时候我们要做类型转换,这样就不安全。而泛型就是来解决这个问题的
泛型类:
格式:
在类名后边加泛型即可。
class Person<T> { //type
public void show(T t){
}
public <V> void method(V v){
}
public static <B> void function(B b){
}
}
泛型方法:
注意:方法的泛型最好和类型的泛型一致。
分类:
非静态方法:
1、泛型可以与类的泛型一直,这样不用定义自己的泛型。
public void show(T t) { }
2、泛型与类的泛型不一致,需要定义自己的泛型。
public <V> void method(V v) { }
静态方法:
必须定义自己的泛型,为什么?
因为静态成员是随着类的加载而加载的,类加载的时候,对象还没有创建。
格式:
public static <B> void function(B b){ }
泛型接口:
格式:
interface Smoke<T>{
void smoke(T t);
}
实现方式:
1、用普通类来实现。
class Demo1 implements Smoke<Student> { //较常用
public void smoke(Student s){
}
}
class Demo2 implements Smoke<Teacher> {
public void smoke(Teacher t){
}
}
2、用泛型类来实现。
class Test<T> implements Somke<T> {
public void somke(T t){
}
}
通配符:<?>
向下限定
? extends E E及其子类
向上限定
? super E E及其父类
|
|