【问题标题】:Using Kotlin singleton from Java在 Java 中使用 Kotlin 单例
【发布时间】:2019-04-22 15:19:22
【问题描述】:

我已经阅读了此内容,并且我所看到的所有内容都表明我应该能够做到这一点,所以我肯定缺少一些小东西。我已将 Java 类转换为 Kotlin:

object OrderTitle {
  @JvmOverloads
    fun generateMessage(context: Activity, otherParameter: AType? = null): AnotherType {
        // Do some things
   }
}

我从 Java 中调用它:

message = OrderTitle.generateMessage(activity, property);

并得到这个错误:

error: non-static method generateMessage(Activity,Property) cannot be referenced from a static context

【问题讨论】:

  • 试试这个OrderTitle.INSTANCE. generateMessage()
  • 如果它是一个单例,你会在 OrderTitle 的实例上调用它,而不是在类上。

标签: java android kotlin singleton


【解决方案1】:

使用 @JvmStatic 注释您的函数,以便在编译时生成一个真正的静态 java 函数。

【讨论】:

  • 对象是否是伴生对象并没有区别:“如果您将这些函数注释为@JvmStatic,Kotlin 还可以为命名对象或伴生对象中定义的函数生成静态方法。”跨度>
【解决方案2】:

你可以使用:

object OrderTitle {
    @JvmStatic
    fun generateMessage(context: Activity, otherParameter: AType? = null): AnotherType {
        // Do some things
   }
}

然后你可以从 Java 中调用它:

OrderTitle.generateMessage(...)

【讨论】:

    【解决方案3】:

    执行此操作的惯用方法是使用顶级函数,

    @file:JvmName("ClassNameHere")
    fun generateMessage(context: Activity, otherParameter: AType? = null): AnotherType {
        // Do some things
    }
    

    然后从 java 中直接使用它

    ClassNameHere.generateMessage()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-05
      • 2020-08-26
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多