2009-10-14 56 views
0

我不明白为什么在某些情况下我可以做出明确的演员,而在其他情况下我不能。谢谢大家!与列表疑问<Generic>明确演员演员

//DAreaLabel extends Message 

//This Code Works 
List<Message> list1 = (List<Message>) 
     Arrays.asList((Message[]) getPageRecords(getClasspath(), methodName, object)); 

DAreaLabel areaLabel = (DAreaLabel) 
     ((List<Message>) Arrays.asList((Message[]) getPageRecords(getClasspath(), methodName, object))).get(0); 

//This Code does not Work 
List<DAreaLabel> list2 = (List<DAreaLabel>) 
     Arrays.asList((Message[]) getPageRecords(getClasspath(), methodName, object)); 
+1

你能格式化它,因此它是可读的吗? – Mark 2009-10-14 16:25:34

+0

编译器给出的错误是什么? – 2009-10-14 16:26:16

+0

小挑逗,但我从英语不是他们的主要语言的人那里看到很多:如果你不明白什么,那么你有一个疑问,毫无疑问。如果你认为某件事可能是错的,那么你有疑问。 – 2009-10-14 19:51:43

回答

5

您的后者无法正常工作,这基本上是因为泛型并非协变。

也就是说,假设DAreaLabelMessage子类型,那么你可以施放消息成DAreaLabel,但你不能投下List<Message>List<DAreaLabel>,这实际上是你正在尝试在后一种情况下做。

1

尽管DAreaLabel(推测)是Message的一个子类,但List<DAreaLabel>不是List<Message>的子类。 Java Tutorial's generics trail说明了原因。因此最后一种情况不能编译。第一种情况也不应该需要铸造。

0

您应该可以将List<Message>转换成List<? extends Message>,然后可以引用List<DAreaLabel>。但是,检索到的实例仍然需要转换为DAreaLabel以使用该类的功能。