无法从静态上下文引用非静态方法 - Java 到 Kotlin - Android

San*_*K P 1 java logging static android kotlin

我正在尝试在 android 中创建一个 Logger 类,它仅在调试版本时才会记录消息。

object Logger2 {

private const val TAG = Constants.LOGGING_TAG

fun d(message : Any?){
    if (BuildConfig.DEBUG)
        Log.d(TAG , message.toString())
}

fun d(message: Any? , e : Exception?){
    if (BuildConfig.DEBUG)
        Log.d(TAG , message.toString(), e)
}
fun e(message : Any?){
    if (BuildConfig.DEBUG)
        Log.e(TAG , message.toString())
}

fun e(message: Any? , e : Exception?){
    if (BuildConfig.DEBUG)
        Log.e(TAG , message.toString(), e)
}

fun w(message : Any?){
    if (BuildConfig.DEBUG)
        Log.w(TAG , message.toString())
}

fun w(message: Any? , e : Exception?){
    if (BuildConfig.DEBUG)
        Log.w(TAG , message.toString(), e)
}

fun v(message : Any?){
    if (BuildConfig.DEBUG)
        Log.v(TAG , message.toString())
}

fun v(message: Any? , e : Exception?){
    if (BuildConfig.DEBUG)
        Log.v(TAG , message.toString(), e)
}

}
Run Code Online (Sandbox Code Playgroud)

由于我希望所有其他活动和类都能够使用此记录器类,因此我将该类创建为 kotlin 对象。

这在所有其他 kotlin 类中工作得很好,我能够像这样调用日志方法,这就是我从 kotlin 类中调用的方式。

Logger2.e("message")
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从 Java 类进行相同的调用时。我收到这样的错误。

在此输入图像描述

有人能告诉我这个错误到底意味着什么以及如何解决它吗?我调用 Logger2 类的方法甚至不是 static 。那为什么会出现这个错误呢?

Ten*_*r04 6

Kotlin 对象并不完全等同于 Java static。他们是单身人士。它们作为类实例存在。当从 Java 访问时,必须通过名为 的静态字段检索单例实例INSTANCE

Logger2.INSTANCE.e("foo");
Run Code Online (Sandbox Code Playgroud)

如果您希望编译器生成这些函数中的每一个,static以便您不必通过单例实例检索它们,则将它们标记为@JvmStatic

object Logger2 {

    @JvmStatic
    fun d(message : Any?){
        if (BuildConfig.DEBUG)
            Log.d(TAG , message.toString())
    } 

    //...
}
Run Code Online (Sandbox Code Playgroud)

有关此内容的文档位于此处

如果您对这样设计的原因感到好奇:

  • Java 类及其静态成员之间的区别有点令人困惑。Java 类的静态字段和方法减去所有非静态成员的集合又被称为什么?这不是任何一件事
  • Kotlin 对象很灵活。它们是类的实例,就像任何其他类实例或函数对象或枚举值一样,因此您可以将它们作为函数参数传递,并且它们可以实现接口或成为其他类的子类。它们可以是扩展函数的接收者。ETC。