Short.compare NoSuchMethodError

内推

【长期有效】欢迎加入字节跳动我的团队:内推链接

起因

项目中需要对数据排序,故需要比较数据属性值的一些大小,而看到Short/Integer/Long/Boolean这些类中,有compare方法可以使用,于是用了起来。

Crash

4.3及以下系统版本,运行到Short.compare时,程序崩溃,堆栈如下:
java.lang.NoSuchMethodError: java.lang.Short.compare
at com.rentee.comparedemo.MainActivity.xxxxxx

疑惑1

为啥崩,看堆栈是没这个方法,于是认真看下API介绍,Short.compare since java 1.7,好吧,应该是"超纲"了,但为啥Lint没有提示呢?
随即AS直接新建了一个demo,发现demo是有Lint提示的:
Call requires API level 19 (current min is 14): java.lang.Short#compare
Hello为啥没有,怀疑Lint配置错了?至今调查未果,懂的大佬支个招?因为Lint NewApi告警是在的,其他"超纲"的都报,暂时发现的,就这个compare,hello工程没检测到。

疑惑2

为啥Short.compare崩,而Integer.compare/Long.compare/Boolean.compare没崩?
xref上查了波Android 4.3源码,发现即使java 1.6,已经有了compare方法,只是标记了@hide
Integer.compare
在这里插入图片描述
Long.compare
在这里插入图片描述
Short.compare
在这里插入图片描述
你没看错,Short.compare中传入的参数是2个long。没理解,这个compare是从long复制过来的么,jdk hide的api质量这么…
而java 1.7中,Short.compare传参确实是short
在这里插入图片描述

疑惑3

long字长大于short,对于低版本Short.compare,java为何没有将传入参数自动转型,从而在低版本java上调用compare(long a, long b)?
思考一下,转型过程应该是在编译器完成的,于是写了以下代码进行验证
在这里插入图片描述
反编译代码如下:
在这里插入图片描述
如所料,是在编译期完成的。那么如果我们将compileSdkVersion改为19以下呢?
对不住,由于compare是hide的,不给调。不过上面也足以验证猜想了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值