通过使用泛型,我们在编译期间检测到任何可能的情况。例如,
List<String> list = new ArrayList<String>();
//list.add(new Integer(45)); This will cause compilation error.
list.add("car");
list.add("bus");
list.add("bike");
String vehicle = list.get(0); //compiler-generated cast
当我们在 Java 1.5 之前使用原始类型而不是泛型时,它需要显式转换。例如,
List list2 = new ArrayList();
list.add("car");
list.add("bus");
list.add("bike");
String vehicle = (String)list.get(0); //explicit casting is necessary
但是对于泛型,会发生类型擦除。即类型信息在运行时丢失。如果是这样,JVM 如何知道它在运行时检索的对象类型是字符串对象还是人员对象(上面的编译器生成的转换)。但这对泛型有效,这可能会导致运行时错误。
List<Object> test = new ArrayList<Object>();
test.add("hello");
test.add(new Integer(34));
最后,Joshua Bloch 在第 115 页(第 23 项,有效 java)中提到,它
Set<Object>
是表示可以包含任何类型对象的集合的参数化类型,
Set<?>
是表示只能包含某些未知类型对象的集合的通配符类型,并且Set
是原始类型,它选择退出泛型类型系统。
我明白他上面所说的意思。一些澄清会有所帮助