Java 如何转换为(已知)泛型类型而不使用;“未经检查”;警告

Java 如何转换为(已知)泛型类型而不使用;“未经检查”;警告,java,generics,events,Java,Generics,Events,我有这两个接口 公共接口事件{ 默认无效分派(){ EventBus.getInstance().dispatch(此); } } 公共接口事件监听器{ 无效句柄(T事件); } 如果我正确理解Java中的泛型,我实际上是在告诉第二个接口的继承者将 然后我提出了下一段代码,在这里可以注册监听器,可以抛出事件,注册的监听器将处理任何抛出的事件 公共类事件总线{ /** *singleton EventBus实例。 */ 私有静态事件总线实例; /** *事件类型及其侦听器的映射。 */ 私有最

我有这两个接口

公共接口事件{
默认无效分派(){
EventBus.getInstance().dispatch(此);
}
}
公共接口事件监听器{
无效句柄(T事件);
}
如果我正确理解Java中的泛型,我实际上是在告诉第二个接口的继承者将

然后我提出了下一段代码,在这里可以注册监听器,可以抛出事件,注册的监听器将处理任何抛出的事件

公共类事件总线{
/**
*singleton EventBus实例。
*/
私有静态事件总线实例;
/**
*事件类型及其侦听器的映射。
*/

私有最终映射不幸的是,虽然您知道
.filter(type->type.isAssignableFrom(event.getClass())
过滤掉了不合适的类型,但编译器不知道(也不可能知道),因此发出警告

您的侦听器映射具有通用参数,不允许您保持完整(编译时)类型安全。通配符确保了这一点。您知道(在编译时)映射包含一些事件的监听器作为值,但一旦将监听器放入其中,就不能再将其取出而不丢失编译时类型安全性

Map<Class<? extends Event>, Set<EventListener<? extends Event>>> listeners

Map感谢您解释,我没有办法让编译器知道。我通常不喜欢忽略警告,但我想我无法摆脱这个警告。我同意您的看法;毕竟,这只是一个警告。