以下是可能的吗?
interface Foo<T> {
public void bar(T object);
}
...
public void callBar(Foo<?> foo) {
foo.bar("Hello world!");
}
显然,这不是类型安全的,因为它假设Foo<?>
在这种情况下实际上是一个Foo<String>
.
但不是通常的“未经检查”警告,这实际上给了我以下错误:Foo 类型中的方法 bar(capture#1-of ?) 不适用于参数 (String)
通常我可以做一些转换来将此异常转换为我想要的警告,但不知何故我现在找不到一个......
任何想法(除了“不要这样做!”,请)?
编辑:
似乎每个人都想讨论“不要这样做”,所以让我解释一下我试图尽可能优雅地解决的整个问题,然后也许有人有更简洁的方法来做到这一点......
我正在尝试编写一个灵活的事件总线系统,我不需要为每个事件声明十亿个接口类型。
我想要一个EventBus
看起来像这样的类:
public class EventBus<GroupType, EventType> {
...
public void addHandler(EventHandler<GroupType, EventType, ?> handler, GroupType group, EventType... events) {
// ^ this is the <?> !!!
// add handler to list of handlers for group and requested event types
}
public <Source> void fireEvent(GroupType group, EventType event, Source source) {
// call all handlers registered for group and event type
}
}
界面EventHandler
如下所示:
public interface EventHandler<GroupType, EventType, Source> {
public void onEvent(GroupType group, EventType event, Source source);
}
这样,我可以简单地编写我的事件处理程序,如下所示:
public class Handler implements EventHandler<Groups, Events, TextBox> {
public void onEvent(Groups group, Events event, TextBox source) {
// Do something with source immediately
}
}
whereGroups
和Events
是描述可能的事件类型的枚举。
然后我注册他们
addHandler(myHandler, Groups.EDIT_BOXES, Events.VALUE_CHANGED, Events.CLEARED, ...);
我可以打电话给他们
fireEvent(Groups.EDIT_BOXES, Events.VALUE_CHANGED, myEditField);
在我的代码中,我知道组中的EDIT_BOXES
所有源都是类型的TextBox
,我不想在我编写的每个处理程序中都用类型转换我的生活。这就是为什么我希望能够在处理程序中实现特定接口,但使用来自 EventBus 的不安全类型转换(我编写一次并永远隐藏)调用它,而不是像这样编写我的所有处理程序:
public class Handler implements EventHandler<Groups, Events> {
public void onEvent(Groups group, Events event, Object source) {
TextBox usableSource = (TextBox) source;
// Do something with usableSource
}
}
如果演员阵容错误,程序将会而且应该以任何方式崩溃和烧毁。即使我在处理程序中放置了“instanceof”检查,我也需要以某种方式将其作为错误抛出。我可以优雅地做到这一点,但这并不重要,因为这种情况下的任何错误都是代码中需要修复的错误,而不是一些运行时用户错误,我应该优雅地通知用户。
现在,我已经看到其他库实现了一个完全类型安全的事件系统,但这通常涉及必须为每种可能的事件类型和每种可能的事件处理程序类型声明接口,有时甚至为事件总线本身上的函数声明接口,其中,如果你问我,是不是比它的价值更痛苦。
如果你们中的任何人有一种干净的方式来做我想要实现的目标,我会很兴奋。但我不确定这是否可行。