java泛型
java泛型是jdk5中引入的新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员编译时检测非法类型,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为同一个参数。
类型擦除
Java的泛型是伪泛型,这是因为在Java编译期间,会将泛型信息都被擦掉,这就是通常所说的类型擦除
下面展示一些 类型擦除代码片
。
package com.haina.java12;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception{
List<Integer>list=new ArrayList<>();
list.add(10);
//直接添加回报错
// list.add("hello");
Class<? extends List> aClass = list.getClass();
Method add = aClass.getDeclaredMethod("add", Object.class);
//通过反射添加时可以的
add.invoke(list,"k1");
System.out.println(list);
}
}
泛型一般有3种使用方式:泛型类,泛型接口,泛型方法
泛型类:
//此处的T可以随便写为任意标识,常见如T K V E等形式的类型表示为参数
//在实例化泛型类时,必须指定具体的参数类型
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);
泛型接口:
public interface Generator<T> {
public T method();
}
//实现泛型接口,不指定类型:
class GeneratorImpl<T> implements Generator<T>{
@Override
public T method() {
return null;
}
}
//实现泛型接口,指定类型:
class GeneratorImpl implements Generator<String>{
@Override
public String method() {
return "hello";
}
}
###泛型方法:
public static <E> void printArray(E[] inputArray) {
for (E element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
// 创建不同类型数组: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3 };
String[] stringArray = { "Hello", "World" };
printArray(intArray);
printArray(stringArray);
常用通配符:T,E,K,V,?
- ?表明不确定java类型
- T表明具体的Java类型
- K V分别表示Java键值中的key ,value
- E代表Element