擦除相同但类型不同。
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 一样重要。
怎么可能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 一样重要。