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

Java调用Kotlin object实现的Utils.sleep方法报静态引用非静态编译错误

问题根因

编译抛出Non-static 'sleep(long)' cannot be referenced from a static context错误,本质是Kotlin和Java对静态调用的实现逻辑不匹配:
Kotlin的object单例类,编译后并不会把类里的方法直接生成Java可识别的静态方法,只会在类内部生成一个静态的INSTANCE单例实例,所有方法都是绑定在这个实例上的普通实例方法。
Java侧直接写Utils.sleep(100)用类名调用方法,找不到对应的静态方法入口,就会触发上述编译错误。

解决方案

方案1:只改Java侧调用逻辑

不需要动Kotlin的Utils类代码,在调用处明确拿到单例的INSTANCE实例再调方法就行:

  • 把所有原来的Utils.sleep(100)这类静态调用写法,改成Utils.INSTANCE.sleep(100)即可正常编译

方案2:改Kotlin代码适配Java调用习惯

给单例类里所有需要被Java以类名直接调用的方法加上@JvmStatic注解,Kotlin编译器在打包时会自动生成真正的Java静态方法,Java侧完全不需要调整原有代码就能正常运行。

修改后的Utils类完整代码:

package com.live.flutter_telephony_rf_example.core.base

import java.net.URLEncoder

object Utils {
    @JvmStatic
    fun urlEncode(s: String?): String? {
        return try {
            URLEncoder.encode(s, "utf-8")
        } catch (t: Throwable) {
            null
        }
    }

    @JvmStatic
    fun sleep(ms: Long) {
        try {
            Thread.sleep(ms)
        } catch (t: Throwable) {
        }
    }

    @JvmStatic
    fun sleep(ms: Long, ns: Int) {
        try {
            Thread.sleep(ms, ns)
        } catch (t: Throwable) {
        }
    }

    @JvmStatic
    fun url_sep(url: String): String {
        return if (url.contains("?")) "&" else "?"
    }
}

注意:修改完成后如果报参数类型不匹配的错误,把传入的整数字面量补上L后缀转成Long类型就行,比如把Utils.sleep(100)改成Utils.sleep(100L),匹配Kotlin方法要求的Long入参类型。

内容的提问来源于stack exchange,提问作者Mahmoud Al-Haroon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 18:24:10