【问题标题】:Kotlin: Java can't resolve Kotlin Symbol?Kotlin:Java 无法解析 Kotlin Symbol?
【发布时间】:2017-06-11 03:38:30
【问题描述】:

我有一个像下面这样的 Kotlin 代码,SingleKotlin.instance 可以被其他 Kotlin 文件调用

class SingleKotlin private constructor(){
    companion object {
        val instance by lazy {
            SingleKotlin()
        }
    }

}

但是,当我尝试从 java 调用 SingleKotlin.instance 时,它显示 can't resolve symbol 'instance'

我不明白为什么,任何人都可以解释,我该如何解决这个问题?

【问题讨论】:

    标签: java kotlin single-instance


    【解决方案1】:

    只需在字段上方添加@JvmStatic 注释(如本文档中所述https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#static-fields

    所以,你的代码应该是这样的:

    class SingleKotlin private constructor(){
        companion object {
            @JvmStatic
            val instance by lazy {
                SingleKotlin()
            }
        }
    }
    

    现在你可以这样称呼它

    SingleKotlin.instance
    

    【讨论】:

    • 感谢 Yurii Kyrylchuk 的回答,添加 @JvmField 后,在 java 代码中,我必须使用“SingleKotlin.getInstance()”
    • @JvmField 不能应用于委托属性,但 @JvmStatic 可以。它会使该属性的 getter 暴露在包含类的静态范围内,因此您必须将该 getter 称为 SingleKotlin.getInstance()
    • 对不起,我弄错了,添加@JvmStatic后,我使用SingleKotlin.getInstance()"
    【解决方案2】:

    除了@YuriiKyrylchuk 的回答:另一种选择(如果您无法控制 Kotlin 代码,也是唯一的选择)是参考 Java 中的MyClass.Companion。示例:

    class MyClass {
        companion object {
            val x: Int = 0
        }
    }
    

    在 Java 中:

    MyClass.Companion.getX();
    

    【讨论】:

      【解决方案3】:

      如果您的SingleKotlin 对象有一个不带参数的私有构造函数,您可以改用object

      object SingleKotlin {
          // some members of SingleKotlin
          val x = 42
      }
      

      然后在 Java 中通过 INSTANCE 静态字段引用它:

      SingleKotlin single = SingleKotlin.INSTANCE;
      // or
      SingleKotlin.INSTANCE.getX();
      

      【讨论】:

        【解决方案4】:

        您需要像这样从 Java 调用方法:
        AppUIUtils.Companion.yourMethod()

        【讨论】:

          【解决方案5】:

          除了 Ilya 的回答,您还可以使用 @JvmStatic 注释

          object SingleKotlin {
              // some members of SingleKotlin
          
              @JvmStatic val x = 42
          }
          

          然后在 Java 中

          SingleKotlin.getX();
          

          【讨论】:

            猜你喜欢
            • 2012-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-05
            • 2016-07-10
            • 2020-11-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多