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

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代码如下:
    class Input{
      companion object{
          // 按键状态数组移到伴生对象内
          private val keyArray: BooleanArray = BooleanArray(GLFW.GLFW_KEY_LAST)
    
          @JvmStatic
          fun isKeyDown(key: Int): Boolean{
              return keyArray[key]
          }
      }
    }
    
    修改后Java侧原有静态调用代码不需要任何改动,可直接正常运行。
  • 方案2(需要保留实例成员场景使用)
    如果业务逻辑要求keyArray必须作为Input类的实例成员存在,就在伴生对象中持有Input类的全局单例实例,通过实例访问keyArray。修改后Kotlin代码如下:
    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]
          }
      }
    }
    
    该方案下Java侧同样可以直接用Input.isKeyDown(xxx)静态调用,需要使用Input实例时也可通过Input.getInstance()获取。

注意:不要在静态方法中每次调用都新建Input实例访问keyArray,会导致每次调用生成独立对象,按键状态无法同步,判断逻辑完全失效。

内容的提问来源于stack exchange,提问作者Tygris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:01:01