【问题标题】:Java Class<capture of ? extends Event> provided but Class<? extends Event> neededJava 类<捕获的 ?提供了扩展事件>,但类<?扩展事件>需要
【发布时间】:2021-09-05 00:20:10
【问题描述】:

所以我有几节课:

public abstract class IEventExecutor<A extends Event> implements EventExecutor {
    
        public final Class<A> type;
    
        public IEventExecutor(Class<A> type){
            this.type = type;
        }
    
        public abstract void event(A a);
    
        @Override
        public void execute(Listener listener, Event event) throws EventException{
            event((A) event);
        }
    }

public class PluginExtension extends Plugin {

    public void register(IEventExecutor<? extends Event> executor){
        EventExecutor e = executor;
        EventManager.registerEvent(executor.type, EventPriority.NORMAL, e, system);
    }

}

registerEvent 方法:

void registerEvent(@NotNull Class<? extends Event> class_, @NotNull Listener listener, @NotNull EventPriority eventPriority, @NotNull EventExecutor eventExecutor, @NotNull Plugin plugin);

在 registerEvent 类中 extends Event> 是必需的,但 executor.type 提供 Class。我不知道,为什么提供“捕获”,这也意味着我不知道如何解决这个问题。有人可以解释发生了什么,是否有办法解决这个问题?

【问题讨论】:

  • 你能出示registerEvent的声明吗?
  • 我在问题中添加了声明。
  • 这里的问题是Java编译器,它在内部注册方法中使用&lt;capture #1 of ? extends Event&gt;作为?类型的名称,不知道也不能推断出类型传递给该方法实际上与 registerEvent 方法所期望的相同,因此会引发该异常。另请参阅this excellent answer
  • @RomanVottner N.B.没有抛出异常;这是一个编译时错误。
  • @chrylis-cautiouslyoptimistic- 你当然是对的。应该再读一遍评论

标签: java


【解决方案1】:

从您的问题中不清楚该错误与哪个代码相关联。但是,您的 PluginExtension 课程在我看来有点不对劲。尝试将register 方法设为通用:

public class PluginExtension extends Plugin {

    public <T extends Event> void register(IEventExecutor<T> executor){
        EventExecutor e = executor;
        EventManager.registerEvent(executor.type, EventPriority.NORMAL, e, system);
    }

}

或者也许让整个类通用。

registerEvent 方法也是如此。将其更改为:

<T extends Event> void registerEvent(
    @NotNull Class<T> class_,
    @NotNull Listener listener,
    @NotNull EventPriority eventPriority,
    @NotNull EventExecutor eventExecutor,
    @NotNull Plugin plugin
);

(但是请注意,您发布的代码调用了 EventManager.registerEvent 的三参数版本,但给了我们五参数版本的签名。)

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多