Java调用Kotlin Input类静态方法无法访问keyArray报错求解
Java静态调用Kotlin方法无法访问类成员问题解决方案
问题复现
- 初始Java代码调用Kotlin实现的Input类的isKeyDown方法时抛出异常:
Non-static method 'isKeyDown(int)' cannot be referenced from a static context
对应错误调用代码:
public Boolean run() { Input.isKeyDown(GLFW.GLFW_KEY_ESCAPE); }
- 尝试将Kotlin方法放入
companion object并添加@JvmStatic注解标记为静态方法后,方法无法访问Input类内定义的keyArray数组,提示Unresolved reference: keyArray,对应错误Kotlin代码:
class Input{ private val keyArray : BooleanArray = BooleanArray(GLFW.GLFW_KEY_LAST) companion object{ @JvmStatic fun isKeyDown(key: Int): Boolean{ return keyArray[key] /*Unresolved reference: keyArray*/ } } }
问题原因
Kotlin中companion object内的成员属于伴生对象本身,等价于Java的静态上下文,而keyArray是Input类的实例成员,必须依托Input类的具体实例才能访问,静态上下文中没有对应实例引用,自然无法直接访问。
正确实现方案
根据Input类的使用场景二选一即可:
- 方案1(单例场景推荐,适配绝大多数输入管理类需求)
把keyArray成员也移动到companion object内,和静态方法处于同一作用域,直接访问即可。修改后Kotlin代码如下:
修改后Java侧原有静态调用代码不需要任何改动,可直接正常运行。class Input{ companion object{ // 按键状态数组移到伴生对象内 private val keyArray: BooleanArray = BooleanArray(GLFW.GLFW_KEY_LAST) @JvmStatic fun isKeyDown(key: Int): Boolean{ return keyArray[key] } } } - 方案2(需要保留实例成员场景使用)
如果业务逻辑要求keyArray必须作为Input类的实例成员存在,就在伴生对象中持有Input类的全局单例实例,通过实例访问keyArray。修改后Kotlin代码如下:
该方案下Java侧同样可以直接用class Input{ private val keyArray: BooleanArray = BooleanArray(GLFW.GLFW_KEY_LAST) companion object{ // 持有全局唯一Input实例 @JvmStatic val instance = Input() @JvmStatic fun isKeyDown(key: Int): Boolean{ // 通过单例实例访问实例成员 return instance.keyArray[key] } } }Input.isKeyDown(xxx)静态调用,需要使用Input实例时也可通过Input.getInstance()获取。
注意:不要在静态方法中每次调用都新建Input实例访问keyArray,会导致每次调用生成独立对象,按键状态无法同步,判断逻辑完全失效。
内容的提问来源于stack exchange,提问作者Tygris
相关产品推荐
相关产品推荐

