You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:03:21