来自https://stackoverflow.com/a/31876747
在Java泛型中,泛型类型定义基本上转换为在所有允许类型参数组合中共享的一个具体泛型类型。因此,多个(源代码级别)类型被映射到一个(二进制级别)类型 - 但结果,在该实例中丢弃了有关实例的类型参数的信息(类型擦除)。
运行时可用的类型信息(使用反射)将丢失。这反过来意味着泛型类型的专业化(使用专门的源代码的能力)任何特定的通用参数组合都非常受限。
“运行时可用的类型信息(使用反射)丢失的后果是什么?”
通用类型的专业化(对任何特定通用参数组合使用专用源代码的能力)的含义非常有限“?
也许是一些例子?
感谢。
答案 0 :(得分:2)
我将从一个名为GenericTest
的简单示例开始。此类尝试查找ArrayList
中使用的参数类型。
public class GenericTest {
// Result would be the same if I have used wildcard (?) instead,
// public static void findType(ArrayList<?> list)
public static void findType(ArrayList list) {
System.out.println(Arrays.toString(
list.getClass().getTypeParameters()));
}
public static void main(String[] args) {
findType(new ArrayList<Integer>());
findType(new ArrayList<String>());
}
}
基于自然本能,我们期望输出为:
[Integer]
[String]
相反,我们获取用作参数占位符的标识符。
[E]
[E]
因此,在Java中,您不知道用于创建ArrayList
的特定实例的实际类型参数。这是因为使用擦除实现了Java泛型。
这意味着特定类型信息将从通用中删除。你唯一知道的就是你正在使用一个物体。
这与C ++的模板世界完全不同。
还有一些差异,但我不会进入这里。