擦除相同但类型不同。

Same erasure but not the same type.

怎么可能ArrayList<Class<?>>ArrayList<Object>有相同的擦除却不能转换成它呢?

我的代码当前在两个 Eclipse 错误之间切换。

GenericExclusiveSelectionPanel transport = 
                new GenericExclusiveSelectionPanel(StringConstants.TRANSPORT,
                    (ArrayList<Object>)TransportManager.getInstance().getTransportTypes());

显示:

Cannot cast from ArrayList<Class<Transportable>> to ArrayList<Object>

如果我删除演员表并创建一个构造函数:
GenericExclusiveSelectionPanel(String, ArrayList<Class<Transportable>>)

我收到日食错误:

Erasure of method GenericExclusiveSelectionPanel(String, 
   ArrayList<Class<Transportable>>) is the same as another method in type 
   GenericExclusiveSelectionPanel

然后将构造函数(下方)突出显示为冲突构造函数。

GenericExclusiveSelectionPanel(String title, ArrayList<Object> arrayList)

如果我们先了解 type erasure 相对于 Generics in [=40] 的含义,就会更容易理解为什么会发生这种情况=].在继续之前先查看 Oracle 文档中的 type erasure

现在您知道了类型擦除的含义,让我们看看 Oracle 文档对 generics 的看法。

从文档中可以清楚地看出,泛型 的主要目标是提供更严格的编译时检查。如果编译器不对泛型的 casting 强制执行检查,那将是相当矛盾的。为了便于讨论,假设允许以下语句:

List<String> strings = new ArrayList<String>();//1
strings.add("123");//2
List<Object> objects = strings;//3
objects.add(1);//4

如果编译器在第 3 步不限制赋值,您可以将 Integer 添加到 String 对象的列表中。 Generics 首先如果编译器不抱怨第 3 步的赋值而允许我们继续第 4 步有什么好处?

类似地,虽然 ArrayList<Class<Transportable>>ArrayList<Object> 具有相同的擦除,但编译器抱怨它们的分配是正确的,如上所述。总之,使用 Generics 限制这些转换与使用相同的擦除限制 constructors/methods 一样重要。