Java 当泛型失败时,我能举个例子吗?

Java 当泛型失败时,我能举个例子吗?,java,generics,Java,Generics,我只是有一个关于泛型的一般性问题。我已经使用它们很多年了,听说它们不是完美的,因为它们在编译时被剥离了类型(正确吗?)。我很难找到导致它们失败的特定代码的示例或解释。有人能给出代码示例和/或解释吗?事情很简单。在Java中,泛型是作为编译器特性实现的,而不是字节码特性 所以,当编译器发现如下内容时: public List<String> getStrings() { return new ArrayList<String>(); } public List

我只是有一个关于泛型的一般性问题。我已经使用它们很多年了,听说它们不是完美的,因为它们在编译时被剥离了类型(正确吗?)。我很难找到导致它们失败的特定代码的示例或解释。有人能给出代码示例和/或解释吗?

事情很简单。在Java中,泛型是作为编译器特性实现的,而不是字节码特性

所以,当编译器发现如下内容时:

public List<String> getStrings() { 
    return new ArrayList<String>();
}
public List getStrings(){
返回新的ArrayList();
}
它转换成字节码,而字节码对泛型一无所知

因此,您缺少的是在对具有该方法的类进行反射时推断泛型信息的能力


另一方面,在.NET framework中,语言(C#)和运行时知道泛型。

例如,此代码将由于擦除而失败:

if (someList instanceof List<String>)
    someList.add(myString);
if(列表的someList实例)
添加(myString);

instanceof
表达式在运行时计算,此时
someList
的类型参数不再可用。

您指的是,编译器将删除与类或方法中的类型参数和类型参数相关的所有信息。这可能造成损害的一个例子是:

ArrayList<String> stringList = new ArrayList<String>();
ArrayList<Integer> integerList = new ArrayList<Integer>();

System.out.println(stringList.getClass().
    isAssignableFrom(integerList.getClass()));
ArrayList stringList=新建ArrayList();
ArrayList integerList=新的ArrayList();
System.out.println(stringList.getClass()。
isAssignableFrom(integerList.getClass());

我们希望它打印的是假的,但实际上它打印的是真的。
stringList
integerList

在泛型失败的情况下(我想是在运行时),您看到了哪些情况? 我不确定泛型对象是否有失败的机会——我的第一个猜测是编译器会捕捉到这种情况,从而告诉您存在类型不匹配或其他问题,因为泛型确保了类型安全


您要查找的术语称为。然而,我看不出这有什么实际问题。“导致[generics]失败”是什么意思?@Matt我想他正在寻找一个类型擦除导致问题/bug的示例。是的,我仍然在寻找一个特定的示例,编译器不会阻止我向集合添加错误的类型。有人能举个例子吗?我想你永远也找不到这样的案例。类型擦除可能会带来一些不便和棘手的情况,但不是像那样明显的错误。有些情况下,特定的泛型构造在一个编译器上编译得很好,但在另一个编译器中编译得不好。你是说这个吗?这是Java。不是.Net。您的链接文章不适用