一、泛型概述
- 泛型的介绍
泛型是JDK5中引入的特性,它提供了编译时类型安全监测机制 - 泛型的好处
①把运行时期的问题提前到了编译器
②避免了强制类型转换 - 泛型定义的格式
<类型>:指定一种类型的格式,尖括号里面可以任意书写,一般只写一个字母
<类型1, 类型2…>:指定多种类型的格式,多种类型之间用逗号隔开
二、泛型类
- 定义格式
修饰符 class 类名<类型> { }
- 实例
public class Demo {
public static void main(String[] args) {
Demo2<Object> objectDemo2 = new Demo2<>();
objectDemo2.show("aa");
Demo2<Object> a1 = new Demo2<>();
a1.show(11);
Demo2<Object> a2 = new Demo2<>();
a2.show(1.2);
Demo2<String> a3 = new Demo2<>();
objectDemo2.show("aa");
Demo2<Integer> a4 = new Demo2<>();
a1.show(11);
Demo2<Double> a5 = new Demo2<>();
a2.show(1.2);
}
}
class Demo2<XX> {
public void show(XX aa) {
System.out.println(aa);
}
}
aa
11
1.2
aa
11
1.2
三、泛型方法
- 定义格式
修饰符 <类型> 返回值类型 方法名(类型 变量名) { }
- 实例
public class Demo {
public static void main(String[] args) {
Demo2<String> st = new Demo2<>();
st.show("aa");
st.show("11","aa");
}
}
class Demo2<AA> {
public <aa> void show(aa bb) {
System.out.println(bb);
}
public <bb> void show(AA xx, bb hh) {
System.out.println(xx);
System.out.println(hh);
}
}
aa
11
aa
四、泛型接口
- 定义格式
修饰符 interface 接口名<类型> { }
- 实现方式
①定义实现类时,定义和接口相同泛型,创建实现类对象时明确泛型的具体类型
②定义实现类时,直接明确泛型的具体类型 - 实例
public class Demo {
public static void main(String[] args) {
AA aa = new AA();
aa.aa("aa");
BB<Object> objectBB = new BB<>();
objectBB.aa(11);
}
}
class BB<QQ> implements Demo2<QQ> {
@Override
public void aa(QQ aa) {
System.out.println(aa);
}
}
class AA implements Demo2<String> {
@Override
public void aa(String aa) {
System.out.println(aa);
}
}
interface Demo2<QQ> {
void aa(QQ aa);
}
aa
11
五、类型通配符
类型通配符:<?>
- ArrayList<?>:表示元素类型未知的ArrayList,它的元素可以匹配任何的类型,但是不能把元素添加到ArrayList中,获取出来的也是父类类型
类型通配符上限:<? extends 类型>
- ArrayList <? extends Number>:它表示的类型是Number或者其子类型
类型通配符下限:<? super 类型>
- ArrayList <? super Number>:它表示的类型是Number或者其父类型