点击领取优惠~
695 字
3 分钟
Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?
Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?
什么是泛型? Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
List<Integer> list = new ArrayList<>();
list.add(12);//这里直接添加会报错list.add("a");Class<? extends List> clazz = list.getClass();Method add = clazz.getDeclaredMethod("add", Object.class);//但是通过反射添加,是可以的add.invoke(list, "kl");
System.out.println(list);泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。
泛型类、泛型接口、泛型方法
1.泛型类:
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型//在实例化泛型类时,必须指定T的具体类型public class Generic<T>{
private T key;
public Generic(T key) { this.key = key; }
public T getKey(){ return key; }}如何实例化泛型类:
Generic<Integer> genericInteger = new Generic<Integer>(123456);2.泛型接口 :
public interface Generator<T> { public T method();}实现泛型接口,指定类型:
class GeneratorImpl<T> implements Generator<String>{ @Override public String method() { return "hello"; }}3.泛型方法 :
public static < E > void printArray( E[] inputArray ) { for ( E element : inputArray ){ System.out.printf( "%s ", element ); } System.out.println(); }使用:
// 创建不同类型数组: Integer, Double 和 CharacterInteger[] intArray = { 1, 2, 3 };String[] stringArray = { "Hello", "World" };printArray( intArray );printArray( stringArray );泛型常用的通配符有哪些? 常用的通配符为: T,E,K,V,?
- ? 表示不确定的 java 类型
- T (type) 表示具体的一个 java 类型
- K V (key value) 分别代表 java 键值中的 Key Value
- E (element) 代表 Element
什么是泛型擦除? 所谓的泛型擦除,官方名叫“类型擦除”。 Java 的泛型是伪泛型,这是因为 Java 在编译期间,所有的类型信息都会被擦掉。 也就是说,在运行的时候是没有泛型的。 例如这段代码,往一群猫里放条狗:
LinkedList<Cat> cats = new LinkedList<Cat>();LinkedList list = cats; // 注意我在这里把范型去掉了,但是list和cats是同一个链表!list.add(new Dog()); // 完全没问题!因为 Java 的范型只存在于源码里,编译的时候给你静态地检查一下范型类型是否正确,而到了运行时就不检查了。上面这段代码在 JRE(Java运行环境)看来和下面这段没区别:
LinkedList cats = new LinkedList(); // 注意:没有范型!LinkedList list = cats;list.add(new Dog());为什么要类型擦除呢? 主要是为了向下兼容,因为 JDK5 之前是没有泛型的,为了让 JVM 保持向下兼容,就出了类型擦除这个策略。
Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?