Java泛型了解么?什么是类型擦除以及常用的通配符有哪些?这篇文章告诉你

导读:
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数


Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦除掉,这就是通常所说的类型擦除

List<Integer> list = new ArrayList<>();

list.add(111);
list.add("abc"); //这里会报错
Class<? extends List> clazz = list.getClass();
Method add = clazz.getDeclaredMethod("add",Object.class);
add.invoke(list,"abc"); //但是可以通过反射添加
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 GenImpl<T> implements Generator<T>{
	@Override
	public T method(){
		return null;
	}
}

实现泛型接口,指定类型:

class GenImpl<T> implements Generator<String>{
	@Override
	public String method(){
		return null;
	}
}

3.泛型方法

public static <E> void printArray(E[] array){
	for (E ele: array){
		System.out.print(ele);
	}
}

使用:

//创建不同类型数组
Integer[] intArray = {1, 2, 3};
String[] strArray = {"Hello","World"};
//调用什么的方法
printArray(intArray);
printArray(strArray);

常用的通配符为:T, E, K, V, ?

  • ? 表示不确定的类型
  • T(type) 表示具体的一个类型
  • K和V分别表示键值对中的key和value
  • E (element) 代表Element

你可能感兴趣的:(Java,java,泛型)