2009-10-14 72 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以使用該類的功能。