在以下示例代码中,两个类EventA
和EventB
都实现了interface Historical
。当其中一个对象作为参数传递时,Java可以自动将EventA
或EventB
转换为Historical
,如下面的examineEvent
方法所示。但是,当引入泛型时,Java不再可以投射,从List<EventA>
到List<Historical>
- 除非使用List<? extends Historical>
声明目标函数(在此例中为findClosestValidEventIndex
)。Java:使用接口指针进行泛型转换
有人可以解释为什么这一定是?在我看来,在通用中使用接口应该自动暗示<? extends Interface>
。
public class SampleApplication {
public interface Historical {
public DateTime getDate();
}
public static class EventA implements Historical {
private DateTime date;
@Override
public DateTime getDate() {
return date;
}
}
public static class EventB implements Historical {
private DateTime date;
@Override
public DateTime getDate() {
return date;
}
}
private static int findClosestValidEventIndex(List<Historical> history, DateTime when) {
// do some processing
return i;
}
private static int examineEvent(Historical event){
return j;
}
public static void main(String[] args) {
DateTime target = new DateTime();
// AOK
EventA a = new EventA(target);
int idy = examineEvent(a);
// Type Error --- Unless
List<EventA> alist = new ArrayList<EventA>();
int idx = findClosestValidEventIndex(alist, target);
}
}
好的,我明白了你的观点。谢谢! – Colin 2011-05-31 17:37:43