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
相关产品推荐
相关产品推荐

