Java泛型擦除:
什么是泛型擦除?
首先了解一下什么是泛型?我个人的理解:由于集合中可以存储任意类型的对象,但是集合中最先存储的对象类型一旦确定后,就不能在存储其他类型的对象了,否则,编译时不会报错,但运行时会抛出ClassCastException异常。为解决此问题,引入泛型,指定该集合对象中存储的对象类型,这样一旦该集合中存储了其他的对象类型,编译时会提示错误!(理解不当之处,希望大神多指点)。
泛型的擦除就是说,在编译的时候集合中指定了确定的对象类型,但在运行时将集合中可以存储的该对象类型擦除了!举例来说的话就是:
- import java.awt.List;
- import java.util.ArrayList;
- public class GenericDemo {
- public static void main(String[] args) {
- ArrayList<String> a = new ArrayList<String>();
- // 集合a中只能存储String类型的对象
- a.add("abc");
- a.add(6); // 报错.运行时注释掉
- ArrayList<Integer> b = new ArrayList<Integer>();
- // 集合b中只能存储Integer类型的对象
- b.add(6);
- b.add("abc"); // 报错.运行时注释掉
- System.out.println(a.getClass() == b.getClass());
- // 输出结果为 true
- /*
- * 原因:泛型运行时具有擦除功能;ArrayList<String>和ArrayList<Integer>擦除
- * 后的类型为ArrayList
- */
- }
- }
注意点:Java不能创建泛型数组:因为Java中的数组都是通过反射动态建立的,在运行时,泛型会擦除类型信息,所以没有了类型信息,当然也就不能构造出数组了。
以上言语措辞或对问题的认识上有什么不当的,希望路过大神指教!