gpt4 book ai didi

Java:使用接口(interface)指针转换为泛型

转载 作者:行者123 更新时间:2023-12-03 23:16:14 27 4
gpt4 key购买 nike

在下面的示例代码中有两个类 EventAEventB都实现了 interface Historical . Java 可以自动转换为 EventAEventBHistorical当这些对象之一作为参数传递时,如 examineEvent下面的方法。但是,当引入泛型时,Java 不再能够转换。来自 List<EventA>List<Historical> -- 除非目标函数(在本例中为 findClosestValidEventIndex )是使用 List<? extends Historical> 声明的.

有人可以解释为什么一定是这样吗?在我看来,在泛型中使用接口(interface)应该自动暗示 <? 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);
}
}

最佳答案

因为 List<EventA> 不是 List<Historical> .想象一下:

List<EventA> list = ...;
List<Historical> h = (List<Historical>) list;
h.add(new EventB()); //type-safety of list is compromised
for (EventA evt : list) { // ClassCastException - there's an EventB in the lsit
...
}

List<? extends Historical>意思是“历史的一个特定子类型的列表”,你不能向它添加任何东西,因为在编译时你不知道类型是什么。

关于Java:使用接口(interface)指针转换为泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6179638/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com