泛型擦除
在编译的时候,编译器会将对象的类型信息擦掉。编译器实现擦除
与C++中的泛型相比而言,Java中的泛型在编译之后没有类型可言,也称伪泛型。
import java.util.ArrayList;
import java.util.List;
public class GenericTest {
public static void main(String[] args) throws Exception {
List<Integer> integerList = new ArrayList<>();
integerList.add(1);
// integerList 到底是什么类型?
System.out.println("integerList 类型是: " + integerList.getClass());
// 通过反射可以向integerList中添加别的类型
integerList.getClass().getMethod("add", Object.class).invoke(integerList, "String");
integerList.getClass().getMethod("add", Object.class).invoke(integerList, 3.1415926D);
for (int i = 0; i < integerList.size(); i++) {
System.out.println(integerList.get(i));
}
}
}
泛型特性
不能是简单类型代码示例
import java.util.ArrayList;
import java.util.List;
public class GenericTest {
public static <T> void doSomething(T ...value){
for (T t: value) {
System.out.println(t);
}
}
public static void main(String[] args) throws Exception {
Integer[] listInteger = new Integer[]{1,2,3};
int [] listInt = new int[]{7,8,9};
doSomething(listInteger);
System.out.println("<========= 分隔符 ========>");
doSomething(listInt);
}
}
输出结果 (简单类型被视为一个对象)
1
2
3
<========= 分隔符 ========>
[I@3796751b