历史原因:在JDK5.0之前,容器存储的对象都只具有java的通用类型:Object。单根继承结构意味着所有东西都是Object类型,所有该容器可以存储任何东西,但是由于容器只存储Object,所以当将对象引入容器时,它必须被向上转型为Object,因此它丢失了身份,将它取出时取到的是一个Object引用,必须将该Object向下转型为更具体的类型。这种转型方式称为向下转型。向上转型是安全的,但是向下转型是不安全的。
那么是否能创建一个容器,它知道自己所保存的对象类型,从而不需要向下转型以及消除犯错误的可能。
这样的解决方案被称为参数化类型机制,参数化类型就是一个编译器可以自动定制作用于特定类型上的类。
这正是SE5.0 的重大变化之一,就是增加了参数化类型,在java中称为泛型。泛型的核心概念:告诉编译器想使用什么类型,编译器帮你处理一切细节。
擦除的神秘之处:
当你深入研究泛型时,你会发现有大量的东西初看起来是没有意义的。例如,尽管可以声明为ArrayList.class,但是不能声明为ArrayList<Integer>.class。因为声明为ArrayList<Integer>.class 中的 <Integer>是没有任何意义的。在编译器后<Integer>是没有的,是被擦除的。
java泛型是使用擦除来实现的,这意味着当你在使用泛型的时,任何具体的 类型信息 都被擦除了,你唯一知道的就是你在使用一个对象。因此List<String>和List<Integer>在运行时 事实上是相同的类型的。这两种形式都被擦除成它们的"原生"的类型

原文:https://www.cnblogs.com/zxbk-xz/p/12796584.html