热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NoSuchMethodError:java.lang.Long.hashCode

如何解决《NoSuchMethodError:java.lang.Long.hashCode》经验,为你挑选了1个好方法。

hashCodeAbstractORM课堂上有以下方法覆盖:

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方法,因为它是从Object或继承的Any.

怎么能找不到Android SDK本身的方法呢?如果SDK不存在,它是如何运行的?

在IntelliJ IDEA中检查该行代码时,它会将我发送给我kotlin.Any.hashCode,而不是发送给我java.lang.Long.hashcode.

任何见解都将非常感谢,提前感谢.



1> m0skit0..:

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

getId().hashCode()

Kotlin 1.1.2生成以下代码:

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

而较新版本的Kotlin会生成其他代码:

Long.hashCode(this.getId())

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

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

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

正如对该问题的评论,切换到Kotlin编译器的Java 1.6目标会生成旧的兼容代码.

在此输入图像描述

PS:我不是100%肯定那些Kotlin版本,请带上一粒盐.


如果将这些设置覆盖到build.gradle文件中,请小心:`compileKotlin {kotlinOptions {jvmTarget ="1.6"}}`
推荐阅读
author-avatar
常德锦江-余欢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有