Java Method.invoke强转long报Cannot cast from object to long解决方法
报错根因
Method.invoke() 的返回值是 Object 引用类型,Java 不允许直接把引用类型强转为 long 这种基本数据类型,所以编译不通过。
如果被反射调用的目标方法本身返回 long 基本类型,反射执行时会自动把结果装箱成 Long 包装类返回,所以只需要把强转目标改成 Long,后续会自动拆箱为 long,就能通过编译。
修复方式
把报错行的 (long) method1.invoke(o) 替换为 (Long) method1.invoke(o) 即可,完整修正后的代码如下:
final Method method1 = method; final Object o = object; LongSupplier longsupplier = new LongSupplier() { private boolean disabled = false; public long getAsLong() { if (this.disabled) { return -1L; } else { try { return (Long) method1.invoke(o); } catch (Throwable throwable) { Config.warn("" + throwable.getClass().getName() + ": " + throwable.getMessage()); this.disabled = true; return -1L; } } } }; return longsupplier;
补充说明
- 请确认你反射调用的目标方法返回值类型是
long或Long,否则运行时会抛出ClassCastException - 如果目标方法可能返回
null,自动拆箱为long时会触发空指针,若存在该场景可以在强转后加判空逻辑,按需返回默认值即可。
内容的提问来源于stack exchange,提问作者ZeRealOne
相关产品推荐
相关产品推荐

