Kotlin中如何获取继承类的默认hashCode实现?
Kotlin/JVM中恢复默认hashCode实现的方法
在Kotlin/JVM中,未重写的hashCode()本质就是调用Java Object类的原生实现——这个实现通常基于对象的内存地址生成哈希值(不同JVM实现细节可能有差异,但核心是和对象引用绑定的唯一标识)。
针对你给出的场景:父类A已经将hashCode()固定返回1,子类B想要跳过父类的实现,恢复到Object原生的hashCode逻辑,可以通过以下两种方式实现:
方法一:借助Java类绕过父类调用
由于Kotlin不允许直接跳过直接父类调用祖父类(Object)的方法,你可以写一个简单的Java类,专门提供调用Object.hashCode()的入口:
// ObjectHashCodeProvider.java public class ObjectHashCodeProvider { public int getObjectHashCode() { return super.hashCode(); } }
然后在Kotlin子类中通过继承或组合的方式使用这个类:
继承方式(仅当父类A没有占用唯一继承位时可用)
class B : A(), ObjectHashCodeProvider() { override fun hashCode(): Int { return getObjectHashCode() } }
组合方式(无继承限制)
class B : A() { private val hashCodeProvider = ObjectHashCodeProvider() override fun hashCode(): Int { return hashCodeProvider.getObjectHashCode() } }
这种方式没有性能损耗,是最推荐的方案。
方法二:通过反射调用Object的hashCode方法
如果不想额外编写Java类,可以用反射直接获取Object类的hashCode()方法并调用:
import java.lang.reflect.Method class B : A() { // 提前获取Method对象避免重复反射开销 private val objectHashCodeMethod: Method = Any::class.java.getDeclaredMethod("hashCode") override fun hashCode(): Int { return objectHashCodeMethod.invoke(this) as Int } }
注意:反射会带来一定的性能损耗,且在有安全管理器限制的环境中可能无法正常使用,仅适合对性能要求不高的场景。
内容的提问来源于stack exchange,提问作者waterstopper
相关产品推荐
相关产品推荐

