gpt4 book ai didi

java - 使用通配符和类型化泛型会生成 "is not applicable for the arguments"错误

转载 作者:行者123 更新时间:2023-11-30 04:26:58 25 4
gpt4 key购买 nike

我目前正在编写一个简单的事件监听器库。
这是我为任何监听器提供的界面:

public interface Listener<T> {
// Event is a very simple type which holds a variable T data.
public boolean run(Event<T> e);
}

我的类Listenable在HashMap中记录所有Listener:

protected HashMap<String, ArrayList<Listener<?>>> listeners;

我在这里使用通配符,因为我希望我的 Listenable 实例具有多个事件类型。

有问题的部分现在出现在我的 Listenable::dispatchEvent() 方法中:

public boolean dispatchEvent(Event<?> evt) {
ArrayList<Listener<?>> evtListeners = listeners.get(evt.getType());
if (evtListeners == null) {
return true;
}

for (Listener<?> lst : evtListeners) {
// vvv--- error
if (!lst.run(evt) || evt.shouldStopPropagation()) {
return false;
}
}


return true;
}

错误消息显示:

The method run(Event) in the type Listener is not applicable for the arguments (Event)

我找到了一个“解决方案”(即让编译器隐藏错误):

for (Listener lst : evtListeners) {
if (!lst.run(evt) || evt.shouldStopPropagation()) {
return false;
}
}

在这种情况下,编译器仅生成两个警告但是我已阅读 here这种技术非常非常差!

<小时/> 我使用此代码可以正常工作

public <T> boolean dispatchEvent(Event<T> evt) {
ArrayList<Listener<?>> evtListeners = listeners.get(evt.getType());
if (evtListeners == null) {
return true;
}

for (int i = 0; i < evtListeners.size(); i++) {
@SuppressWarnings("unchecked")
Listener<T> lst = (Listener<T>) evtListeners.get(i);

if (!lst.run(evt) || evt.shouldStopPropagation()) {
return false;
}
}

return true;
}

但我怀疑这是干净的代码,不是吗?我假设我的库的用户不会混合相同事件类型的类型 (evt.getType())。

如果有任何建议,我将不胜感激!

最佳答案

您应该将方法的签名更改为

public <T> boolean dispatchEvent(Event<T> evt)

并使用T作为类型:

for (Listener<T> lst : (ArrayList<Listener<T>>) evtListeners) {

请注意,这通常会发出“未经检查的对话”警告,您可以使用 @SuppressWarnings("unchecked") iirc 禁用该警告。

编辑:很难摆脱未经检查的对话警告。它们只是意味着编译器不能强制执行该转换。下面的语句是正确的,没有用,并且稍后会在某个地方炸毁你的代码:

ArrayList<Thread> al1 = new ArrayList<Thread>();
al1.add(new Thread());
ArrayList<Exception> al2 = (ArrayList<Exception>) al1;

Java 中的泛型或多或少只是一个编译时提示,可以节省强制转换并为您提供更多类型安全性。

关于java - 使用通配符和类型化泛型会生成 "is not applicable for the arguments"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15638400/

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