使用泛型时toString与String.valueOf()的区别
1、首先看下面代码:
1 | public class CreateOrgNotifyEventListener extends AbstractOnsEventListener<CreateOrgNotifyEventPayload> { |
2、代码中event.getPayload()会返回泛型T即CreateOrgNotifyEventPayload类型,但是却不能直接用如下代码获取CreateOrgNotifyEventPayload,会触发ClassCastException: String不能强转为CreateOrgNotifyEventPayload。
1 | 2.1、CreateOrgNotifyEventPayload payload = event.getPayload(); |
3、因为payload为String类型:
1 | public interface OnsMessageEvent<T> { |
分析:
第2部分代码中,2.1代码很好理解,2.2就有点意思了。
按理说所有的对象都实现了toString()方法,event.getPayload()真实数据类型也是String,为什么event.getPayload().toString()会出发ClassCastException呢?
而String.valueOf(event.getPayload())就没有问题,String.valueOf源码:
1 | public static String valueOf(Object obj) { |
解决:
猜测泛型对象payload.toString()出错原因是方法执行顺序,先转CreateOrgNotifyEventPayload再执行toString();
而String.valueOf是跳过类型转换,直接执行toString()
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!