NoSuchMethodError:java.lang.Long.hashCode

我在AbstractORM类中的hashCode上覆盖了以下方法:

 var _id = Random().nextLong() override fun getId() = _id // AbstractORM class implements an interface that defines this method getId() override fun hashCode() = getId().hashCode() 

突然开始抛出以下异常:

 FATAL EXCEPTION: main java.lang.NoSuchMethodError: java.lang.Long.hashCode at com.company.ormlite.AbstractORM.hashCode(AbstractORM.kt:271) at java.util.HashMap.put(HashMap.java:390) at java.util.HashSet.add(HashSet.java:95) at kotlin.collections.ArraysKt___ArraysKt.toCollection(_Arrays.kt:6518) at kotlin.collections.ArraysKt___ArraysKt.toSet(_Arrays.kt:6853) at kotlin.collections.SetsKt__SetsKt.setOf(Sets.kt:32) at com.company.android.tna.orm.DataManager.getTables(DataManager.kt:16) at com.company.android.tna.orm.DataManager.getTables(DataManager.kt:10) at com.company.android.core.utils.AbstractDataManager.create(AbstractDataManager.kt:25) at com.company.android.core.utils.AbstractDataManager.start(AbstractDataManager.kt:44) at com.company.android.core.utils.AbstractZKApplication.onCreate(AbstractZKApplication.kt:54) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151) at android.app.ActivityThread.access$1300(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) 

这让我目瞪口呆有几个原因:

  • Java和Kotlin中的所有类都有hashCode方法,因为它是从ObjectAny继承的。
  • 如何找不到Android SDK本身的方法? 如果SDK不存在,它是如何运行的?
  • 在IntelliJ IDEA中检查该行代码时,它会将我发送到kotlin.Any.hashCode ,而不是发送到java.lang.Long.hashcode

任何深刻的见解,将不胜感激,在此先感谢。

在检查编译的AbstractORM类后,我发现问题:较新的Kotlin版本为该行生成不同的代码

 getId().hashCode() 

Kotlin 1.1.2生成以下代码:

 Long.valueOf(this.getId()).hashCode() 

而更新版本的Kotlin生成这个其他代码:

 Long.hashCode(this.getId()) 

问题是,Android中的这个静态方法Long.hashCode(long)仅在API 24(Android 7.0)之后才可用,而我正在测试具有版本4.1(API 16)的Android设备。

我暂时通过手动计算哈希代码来修复,尽管我已经在这里打开了一个问题。

 override fun hashCode() = (getId() xor getId().ushr(32)).toInt() 

就此问题发表评论,切换到Kotlin编译器的Java 1.6目标会生成旧的兼容代码。

在这里输入图像描述

PS:对于Kotlin的版本,我不是100%肯定的,请带上一点盐。

我不知道如何解决你的问题,但我会尽力解释你为什么得到这个例外。

Java 8中,一个新的静态方法被添加到Long类中:

 public static int hashCode(long value) 

从那时起, hashCode()方法如下所示:

 public int hashCode() { return hashCode(this.value); // call Long.hashCode() static method } 

所以看来你有一些Java版本的问题。