作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在编写一个简单的事件监听器库。
这是我为任何监听器提供的界面:
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/
我是一名优秀的程序员,十分优秀!