java泛型
所属分类 java
浏览量 1165
Java 泛型 generics
泛型类 泛型接口 泛型方法
编译时检查类型 ,所有的强制转换都是自动和隐式的
安全 简洁 可读性好
避免强制类型转换 ClassCastException
泛型通配符
? 不确定的类型
T type 表示具体的一个java类型
K V key value
E element
无边界通配符 List>
上边界限定通配符 extends E> 泛型中的参数必须是 E 或者 E 的子类
下边界通配符 super E> 泛型中的参数必须是所指定的类型E,或者是此类型的父类型,直至 Object
Fruit[]与Apple[] 兼容
List< Fruit > 与 List< Apple > 不兼容
//
List> list = new ArrayList<>();
list.add(666);
public class Holder {
private final T data;
public Holder(T data){
this.data = data;
}
public T getData(){
return data;
}
}
Holder holder = new Holder("hello");
System.out.println(holder.getData());
System.out.println(holder.getClass());
Holder holder2 = new Holder<>(3);
System.out.println(holder2.getData());
System.out.println(holder2.getClass());
// 泛型实例方法
private T max(T t1, T t2) {
return t1.compareTo(t2) >= 0 ? t1 : t2;
}
// 泛型静态方法
private static T max2(T t1, T t2) {
return t1.compareTo(t2) >= 0 ? t1 : t2;
}
private static T convert(Object a) {
return (T) a;
}
List list = new ArrayList();
list.add("hello");
//普通转换
ArrayList list1 = (ArrayList) list;
//静态泛型转换
ArrayList list2 = convert(list);
// java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
// String str = convert(list);
类型擦除
泛型的限制
不支持 Pair ,只支持Pair
运行时类型只能获取到原始类型 因为类型擦除了
不能创建参数化类型的数组
// 不能创建参数化类型的数组
// Holder[] holders = new Holder[3] ;
不能实例化类型变量
// 不能实例化类型变量
// this.data = new T();
使用泛型接口时,避免重复实现同一个接口
interface Swim {}
class Duck implements Swim {}
class UglyDuck extends Duck implements Swim {}
可以消除对checked异常的检查
public static void throwAs(Throwable e) throws T { throw (T) e; }
定义API返回值,使用泛型
Java泛型常见面试题
使用泛型的好处
什么是类型擦除
泛型中的限定通配符和非限定通配符
泛型通配符与上下界
List extends T>和List super T>之间的区别
java泛型技巧
泛型例子代码
https://gitee.com/dyyx/hellocode/tree/master/src/dyyx/generic
上一篇
下一篇
springboot中使用 JWT
java访问修饰符
java内部类
Linux Load 查看及计算
数据仓库术语
spring-session-jdbc使用数据库存储共享session