2017-01-22 56 views
0

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) 
+2

为什么你会期望一种类型可以被转换为另一种类型,只是因为它们具有相同的擦除? – user2357112

+0

@LawrenceColes请阅读[我应该怎么做当有人回答我的问题](http://stackoverflow.com/help/someone-answers)。是的,很好的问题。从我+1。请看看我的答案,并让我知道你是否需要任何澄清 – CKing

回答

0

它会更容易理解为什么会这样,如果我们先了解一下类型擦除相对于泛型在Java中表示。继续操作之前,请从Oracle文档中查看type erasure

现在您知道什么类型的擦除意味着,让我们看看Oracle文档有关generics的说明。

从文档中应该清楚,泛型的主要目标是提供更严格的编译时检查。如果编译器没有强制执行铸造与泛型的检查将是相当矛盾的。为了便于讨论,考虑假设下列语句被允许:

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

如果编译器不限制在步骤3的分配,你就可以到Integer添加到String对象的列表。 如果编译器没有在步骤3中抱怨分配,而又允许我们继续执行步骤4,则首先使用泛型有什么好处?

类似地,虽然ArrayList<Class<Transportable>>ArrayList<Object>具有相同的擦除,编译器就在抱怨他们的任务,如上所述。总之,用泛型限制这些类型与使用相同擦除限制构造函数/方法同样重要。

相关问题