gpt4 book ai didi

java - 列表中具有泛型方法参数类型的接口(interface)

转载 作者:行者123 更新时间:2023-12-01 13:49:48 24 4
gpt4 key购买 nike

我有一个 HashMap,它将特定的 RequestType 链接到单独的 LinkedList。这些列表由具有通用类型的接口(interface)组成。添加到 map 中的列表没有问题,但我似乎无法从 map 中获取列表。

我将向您展示我的两次尝试以及相应的错误。首先我会向您展示界面以及当我想调用界面中的方法时我的Map。

public interface IRequestListener<Result> {
public void resultUpdated(Result result);
}

private HashMap<RequestType, LinkedList<IRequestListener<?>>> requestListenerMap =
new HashMap<RequestType, LinkedList<IRequestListener<?>>>();

在下面的代码中,RequestType和Notification是两个简单的枚举。

这是第一次尝试:

Notification notification = Notification.AVOID;
LinkedList<IRequestListener<?>> listeners =
requestListenerMap.get(RequestType.NOTIFICATION);
for(IRequestListener<?> listener : listeners) {
listener.resultUpdated(notification); // ERROR ON THIS LINE
}

这会导致以下错误:

The method resultUpdated(capture#1-of ?) in the type 
IRequestListener<capture#1-of ?> is not applicable for
the arguments (Notification)

这是第二次尝试:

Notification notification = Notification.AVOID;
LinkedList<IRequestListener<Notification>> listeners =
requestListenerMap.get(RequestType.NOTIFICATION); // ERROR ON THIS LINE
for(IRequestListener<Notification> listener : listeners) {
listener.resultUpdated(notification);
}

这会导致以下错误:

Type mismatch: cannot convert from LinkedList<IRequestListener<?>> 
to LinkedList<IRequestListener<Notification>>

我认为我被泛型棘手的继承/转换问题所困扰,但我不知道如何解决。我不想扩展Notification,因为此时界面中的Result可以是Notification,也可以是Integer。稍后我可能还会添加将列表作为结果的可能性。

干杯。

最佳答案

听起来您想限制 Result 类型参数来扩展 Notification:

private HashMap<RequestType, LinkedList<IRequestListener<? extends Notification>>> 
requestListenerMap = new HashMap<>(); // Assuming Java 7

...

LinkedList<IRequestListener<? extends Notification>> listeners =
requestListenerMap.get(RequestType.NOTIFICATION);
for(IRequestListener<? extends Notification> listener : listeners) {
listener.resultUpdated(notification);
}

现在,如果这不适合 map 声明 - 因为您想要存储其他条目的其他列表 - 您可能需要不安全的强制转换:

private HashMap<RequestType, LinkedList<IRequestListener<?>>> requestListenerMap = 
new HashMap<RequestType, LinkedList<IRequestListener<?>>>();

...

LinkedList<IRequestListener<?>> listeners =
requestListenerMap.get(RequestType.NOTIFICATION);
for (IRequestListener<?> listener : listeners) {
// Note that this cast is unsafe.
IRequestListener<? extends Notification> notificationListener =
(IRequestListener<? extends Notification>) listener;
notificationListener.resultUpdated(notification);
}

从根本上来说,您无法安全地执行此操作,因为执行时类型不会包含类型参数。但是,如果不合适,当您调用 resultUpdated 时,您会收到 ClassCastException

关于java - 列表中具有泛型方法参数类型的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20050509/

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