当前位置: 首页 > 知识库问答 >
问题:

java - 这里的Raw use of parameterized class 'Event'警告如何处理是正确的?

卜昂熙
2024-05-13

定义了一个泛型类Event如下

public class Event<T> {    private T data;    private int code;    public Event(T data, int code) {        this.data = data;        this.code = code;    }    public T getData() {        return data;    }    public int getCode() {        return code;    }}    

如下方式使用

  @Subscribe(threadMode = ThreadMode.MAIN)    public void onEvent(Event e) {        switch (e.getCode()) {            case Event.LOAD_FILTER_DATA:                filterDrawerBeanList = (List<FilterDrawerBean>) e.getData();                //xxx业务处理                break;            case Event.SEND_CONTRACT_CHECK:                CustomerCheckMessage checkMessage = (CustomerCheckMessage) e.getData();                //xxx业务处理                break;        }    }

因为不同的事件中Event中需要传递不同类型的数据。所以 onEvent 这里就无法指定具体的类型。

有两个问题

  1. ide报警:Raw use of parameterized class 'Event'。这里正确的实现方式是什么呢?
  2. 强转报警

共有2个答案

通和裕
2024-05-13

改成这样:

  public void onEvent(Event<?> e) {
越源
2024-05-13

IDE 的警告 Raw use of parameterized class 'Event' 意味着你在使用泛型类 Event 时没有指定类型参数,即你使用了原始的 Event 类型而不是带类型参数的 Event<T>。为了消除这个警告,你应该在 onEvent 方法的参数中指定 Event 的具体类型参数。

由于你需要在 onEvent 方法中处理不同的事件类型,这通常意味着你需要为每种事件类型定义一个单独的 Event 子类或者使用带有特定类型参数的 Event

一种可能的解决方案是创建多个继承自 Event 的具体事件类,每个类都有具体的类型参数。这样,你就可以为每个事件类型定义不同的处理器方法。

例如:

public class LoadFilterDataEvent extends Event<List<FilterDrawerBean>> {    public LoadFilterDataEvent(List<FilterDrawerBean> data, int code) {        super(data, code);    }}public class SendContractCheckEvent extends Event<CustomerCheckMessage> {    public SendContractCheckEvent(CustomerCheckMessage data, int code) {        super(data, code);    }}

然后,你的事件监听器可以定义为:

@Subscribe(threadMode = ThreadMode.MAIN)public void onLoadFilterDataEvent(LoadFilterDataEvent event) {    List<FilterDrawerBean> filterDrawerBeanList = event.getData();    // xxx业务处理}@Subscribe(threadMode = ThreadMode.MAIN)public void onSendContractCheckEvent(SendContractCheckEvent event) {    CustomerCheckMessage checkMessage = event.getData();    // xxx业务处理}

这样,每个事件类型都有自己的监听器方法,你避免了原始类型的使用,并且 IDE 也不会再发出警告。

如果你不能或者不想为每个事件类型创建单独的子类,另一种选择是使用通配符类型,但这通常会使类型安全性降低。在 Java 中,你可以使用有限制的通配符来捕获不同类型的 Event

@Subscribe(threadMode = ThreadMode.MAIN)public void onEvent(Event<?> event) {    switch (event.getCode()) {        case LOAD_FILTER_DATA:            @SuppressWarnings("unchecked")            List<FilterDrawerBean> filterDrawerBeanList = (List<FilterDrawerBean>) event.getData();            // xxx业务处理            break;        case SEND_CONTRACT_CHECK:            @SuppressWarnings("unchecked")            CustomerCheckMessage checkMessage = (CustomerCheckMessage) event.getData();            // xxx业务处理            break;        // ... 其他事件    }}

但是,请注意,上面的代码使用了不安全的类型转换(@SuppressWarnings("unchecked")),这可能导致运行时 ClassCastException 如果 getData() 返回的数据类型不匹配。

通常,最佳实践是避免使用原始类型,并尽可能利用泛型提供的类型安全性。在事件处理中,为每个事件类型定义具体的类是一个更好的选择,因为它既安全又清晰。

 类似资料:
  • 我是android/java编程新手,对如何正确处理这个警告感到困惑。 方法调用“”可能会生成“Java”。lang.NullPointerException' 任何帮助都将不胜感激。

  • 本文档介绍 DM 中各主要告警信息的处理方法。 高可用告警 DM_worker_offline 存在离线的 DM-worker 超过一小时会触发该告警。在高可用架构下,该告警可能不会直接中断任务,但是会提升任务中断的风险。处理告警可以查看对应 DM-worker 节点的工作状态,检查是否连通,并通过日志排查错误。 DM_DDL_error 处理 shard DDL 时出现错误,此时需要参考 DM

  • 我得到这个错误- (节点:18420)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“name” (节点:18420)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终止节点进程,请

  • 问题内容: 我写了这样的PHP代码 但是,当我从中删除“ http://”时,出现以下警告: 警告:file_get_contents(www.google.com)[function.file-get-contents]:无法打开流: 我试过了,但是没有用。 问题答案: 步骤1:检查返回码: 步骤2:通过在调用 _file_get_contents()的_前面放置一个错误控制运算符(即)来抑制警

  • 问题内容: 用Java产生和使用外部进程的流(IO)的正确方法是什么?据我所知,由于可能的缓冲区大小有限,因此应在与生成进程输入并行的线程中使用java结束输入流(进程输出)。 但是我不确定我是否最终需要与这些使用者线程进行同步,或者仅等待进程退出以使用方法就足够了,以确保所有进程输出实际上都被消耗了?IE是否有可能,即使进程退出(关闭其输出流),流的Java端仍存在未读数据?实际如何知道该过程何

  • 我有一个3页的结账流程。第一页是客户信息。第二页是卡片信息。第三页是回顾 我使用贝宝api处理付款处理。现在我有支付页面设置与贝宝api的请求参数存储在一个数组中,并在客户点击确认后