定义了一个泛型类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 这里就无法指定具体的类型。
有两个问题
Raw use of parameterized class 'Event'
。这里正确的实现方式是什么呢?改成这样:
public void onEvent(Event<?> e) {
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的请求参数存储在一个数组中,并在客户点击确认后