我只是对泛型有一个普遍的问题。我已经使用它们多年了,并且听说它们不完美,因为它们在编译时被剥离了它们的类型(对吗?)。我很难找到导致它们失败的特定代码的示例或解释。任何人都可以提供代码示例和/或解释吗?
答案 0 :(得分:5)
您所指的是Type Erasure,其中编译器删除与类型参数相关的所有信息并在类或方法中键入参数。这可能是一个不利的例子是:
ArrayList<String> stringList = new ArrayList<String>();
ArrayList<Integer> integerList = new ArrayList<Integer>();
System.out.println(stringList.getClass().
isAssignableFrom(integerList.getClass()));
我们希望这会打印出来,但它实际上是真的。 stringList
和integerList
之间没有类别区别。
答案 1 :(得分:1)
事情很简单。在Java中,泛型是作为编译器功能实现的,而不是字节码功能。
所以,当编译器找到类似这样的东西时:
public List<String> getStrings() {
return new ArrayList<String>();
}
它转换为对泛型不了解的字节码代码。
因此,您缺少的是在对具有该方法的类进行反射时推断通用信息的能力。
另一方面,在.NET框架中,语言(C#)和运行时知道泛型。
答案 2 :(得分:1)
此代码例如因擦除而失败:
if (someList instanceof List<String>)
someList.add(myString);
instanceof
表达式在运行时进行评估,此时someList
的类型参数不再可用。
答案 3 :(得分:-1)
您在哪些情况下看到泛型会失败(在运行时我认为)? 我不确定一个通用对象是否有机会失败 - 我的第一个猜测是这会被编译器捕获,从而告诉你存在类型不匹配或者因为泛型确保类型安全性所以。