对List <generic> Explicit Cast </generic>的疑问

时间:2009-10-14 16:22:17

标签: java generics casting

我不明白为什么在某些情况下我可以做一个明确的演员,而在其他情况下我不能。谢谢大家!

//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));

3 个答案:

答案 0 :(得分:5)

你的后者演员不起作用,主要是因为泛型不是协变的。

也就是说,假设DAreaLabelMessage的子类型,那么您可以将消息转换为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才能使用该类的功能。