泛型
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、接口和方法所存储或使用的一个或多个类型的占位符。
-
类型擦除
-编码时采用泛型写的类型参数,编译器会在编译时时去掉,称为“类型擦除”。类型参数在编译后替换成Object,运行时虚拟机不知道泛型。
定义泛型
- 泛型字符常用标志符
泛型标识符 | 说明 |
---|---|
E | 表示容器中的元素 |
T | 表示普通的JAVA类 |
K | 表示键 |
V | 表示值 |
N | 表示数据类型 |
? | 表示不确定的JAVA类型 |
泛型类
- 泛型类定义在类上,用户实例化类时,才把类型确定下来。在<>中可以添加一个或者多个类型参数声明,如,<E,T>等
- 语法结构
代码示例
public class demo01<T> {
private T flag;
public T getFlag() {
return flag;
}
public void setFlag(T flag) {
this.flag = flag;
}
}
泛型接口
- 语法结构
代码示例
public interface demo02<T> {
T getName(T name);
}
泛型方法
泛型方法指将方法的参数类型定义成泛型,以便在调用时接受不用类型的参数。调用泛型方法时,不需要告诉编辑器是什么类型,编译器可以自动推断出类型出来。
-
语法结构
无返回值 有返回值
public <泛型符号> 泛型符号 getName(泛型表示符号){ return; }
代码示例
public class demo03 {
public <T> void getName(T name){
System.out.println(name);
}
public <T> T getMethod(T method){
return method;
}
}
泛型方法可变参数
- 语法结构
代码示例
public class demo05 {
public <T> void method(T ...args){
for (int i = 0; i <args.length ; i++) {
System.out.println(args[i]);
}
}
}
无界通配符
“?”表示类型通配符,代替具体的类型,解决具体类型不确定的问题。
- 语法结构
代码示例
public class demo06<T> {
private T age;
public T getAge() {
return age;
}
public void setAge(T age) {
this.age = age;
}
}
public class middle{
public void method(demo06<?> a){
System.out.println(a.getAge());
}
}
public class demo06test {
public static void main(String[] args) {
middle middle = new middle();
demo06<String> a6 = new demo06<>();
a6.setAge("12");
middel.method(a6);
demo06<Integer> a66 = new demo06<>();
a66.setAge(66);
middel.method(a66);
}
}
通配符的上限限定
上限限定表示通配符的类型是T类以及T类的子类或者T接口以及T接口的子接口
- 语法结构
通配符的下限限定
下限限定表示通配符的类型T类以及T类的父类或者T接口以及T接口的父接口
- 语法结构