NoSuchMethodError: java.lang.Long.hashCode

Tengo la siguiente anulación del método en hashCode en la class AbstractORM :

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

que de repente comenzó a arrojar la siguiente exception:

 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) 

Esto me ha dejado estupefacto por varias razones:

  • Todas las classs en Java y Kotlin tienen el método hashCode ya que se henetworkinga de Object o Any .
  • ¿Cómo no puede encontrar un método que esté en el SDK de Android? Si el SDK no está presente, ¿cómo se está ejecutando?
  • Al inspeccionar esa línea de código en IntelliJ IDEA, me envía a kotlin.Any.hashCode , no a java.lang.Long.hashcode .

Cualquier idea sería muy apreciada, gracias de antemano.

Después de verificar la class comstackda de AbstractORM , encontré el problema: las versiones más nuevas de Kotlin generan un código diferente para esa línea.

 getId().hashCode() 

Kotlin 1.1.2 genera el siguiente código:

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

mientras que las versiones más nuevas de Kotlin generan este otro código:

 Long.hashCode(this.getId()) 

El problema es que este método estático Long.hashCode(long) en Android solo está disponible desde API 24 (Android 7.0), mientras estoy probando en un dispositivo Android que tiene la versión 4.1 (API 16).

Estoy arreglando temporalmente al calcular el código hash manualmente, aunque he abierto un problema aquí .

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

Como se comentó sobre el problema , el cambio a Java 1.6 objective para el comstackdor de Kotlin genera el código compatible anterior.

enter image description here

PD: No estoy 100% seguro acerca de esas versiones de Kotlin, por favor tómalo con un grano de sal.

No estoy seguro de cómo resolver su problema, pero intentaré explicar por qué está recibiendo esta exception.

En Java 8 , se agregó un nuevo método estático a una class Long :

 public static int hashCode(long value) 

Y desde entonces el método hashCode() se ve así:

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

Parece que tienes algunos problemas con la versión de Java .

  • ¿Por qué para el loop con comstackciones de tres puntos?
  • ¿Es posible usar Mockito en Kotlin?
  • No se puede conectar a Remote Mongo DB mediante Springboot
  • Hibernate guarda la entidad hija con nulo ID padre
  • Método de ejecución en el object kotlin
  • El uso de más es igual al operador con bytes
  • ¿Cómo puedo enmascarar una contraseña con Anko?
  • Sintaxis de la function de Kotlin
  • Cómo mostrar una notificación en la aplicación que no se queda en el cajón de notifications de Snapchat
  • Kotlin - Cómo agregar OnPageChangeListener en ViewPager
  • Obteniendo datos de local y remoto simultáneamente usando RxJava