我不明白为什么在某些情况下我可以做一个明确的演员,而在其他情况下我不能。谢谢大家!
//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));
答案 0 :(得分:5)
你的后者演员不起作用,主要是因为泛型不是协变的。
也就是说,假设DAreaLabel
是Message
的子类型,那么您可以将消息转换为DAreaLabel,但不能强制转换List<Message>
一个List<DAreaLabel>
,这实际上是你在后一种情况下要做的事情。
答案 1 :(得分:1)
即使DAreaLabel
(可能)是Message
的子类,List<DAreaLabel>
也不是List<Message>
的子类。 Java Tutorial's generics trail说明原因。因此最后一个案例不编译。第一种情况也根本不需要铸造。
答案 2 :(得分:0)
您应该能够将List<Message>
投射到List<? extends Message>
,然后可以引用List<DAreaLabel>
。但是,检索到的实例仍然需要强制转换为DAreaLabel
才能使用该类的功能。