getAttr()的返回值类型请教

无标题.png

这个里面的 getAttr当不使用 toString() 方法的时候,一直报错 java.lang.String cannot be cast to [Ljava.lang.Object;

我看了下,getAttr返回的是<T>object ,这个为什么非要toString()一下呢?

评论区

JFinal

2019-01-29 21:39

在 JDK 8 之下,如果方法参数是 Object ... paras 类型,并且传入的参数值是通过调用方法获取的,并且这个方法返回的是泛型的话,就会出现这个类型转换异常问题

也就是说要同时满足下面几个条件才会出现:
1:JDK 版本是 8 或更高
2:方法原型中带有一个 Object... paras 参数
3:传入参数时是方法调用,例如 record.get("title")、getAttr(...) 等等
4:第三条中的方法调用的返回值类型是泛型,例如上面的 record.get(...) 与 getAttr(...) 返回值类型都是泛型

解决办法极其简单,下面的方法任选其一:
1:使用强制类型转换,例如:findFirst(..., (Object)getAttr(...));
2:引入一个中间变量,例如:
Object para = getAttr(...);
findFirst(..., para);

解决方案都是为了消除 JDK 8 的 Object... 传参类型错误的问题,低版本 JDK 没有这个问题。

高版本的 JDK 或许是为了提升性能才有了这个变化

JFinal

2019-01-29 21:42

JDK 8 相对于低版本 JDK 的这个行为,还影响到了 Model.findById(...) 、Model.deleteById(...)、 Db.findById(...) 这三个方法,jfinal 3.6 改进了这里,避免了 JDK 8 带来的影响

对于 findFirst 来说,目前的解决办法只能是上个回复里头的方法。

热门反馈

扫码入社