繁体   English   中英

如何在 Java 中访问 Kotlin 伴侣对象?

[英]How to access Kotlin companion object in Java?

我将我的 Java 类之一转换为 Kotlin 和如下所示的类。

class MainApplication : Application() {
    companion object {
        operator fun get(context: Context): MainApplication {
            return context.applicationContext as MainApplication
        }
    }
}

它有一个静态函数get

我仍然有一个 Java 函数可以访问它。

MainApplication application = MainApplication.get(mContext);

当 MainApplication 在 Java 中时很好。 但是在Kotlin中MainApplication的时候不行,上面的代码报错

Error:(27, 54) error: cannot find symbol method get(Context)

我如何访问上面的 Java 代码中的get

您可以在伴随对象中的方法中添加@JvmStatic注解,使 Kotlin 生成静态方法。

class MainApplication : Application() {
    companion object {
        @JvmStatic fun get(context: Context): MainApplication {
            return context.applicationContext as MainApplication
        }
    }
}

然后,您可以像在转换为 Kotlin 之前一样从 Java 访问它:

MainApplication application = MainApplication.get(mContext);

编辑:我觉得有必要添加一些我最近学到的东西: @JvmStatic实际上并没有移动到生成方法的位置。 除了伴随对象上的方法之外,它还通过为 Java 生成静态方法来复制它。 我个人认为这不是很好,它可能会根据用例产生一些影响,因此值得了解。

哦,我明白了。 只需使用下面的。

MainApplication application = MainApplication.Companion.get(mContext);

通过省略伴随对象的名称,必须使用名称Companion来访问方法。

示例:

class MyClass1 {
    companion object Object1 {
        fun method1 {
        }
    }
}

class MyClass2 {
    companion object {
        fun method2 {
        }
    }
}

要调用第一个伴随对象方法,您将执行以下操作:

MyClass1.method1()

调用第二个:

MyClass2.Companion.method2()

有关详细信息,请参阅关于伴随对象的 Kotlin 文档。

如果在方法调用中使用了new关键字,您可能会遇到 Java 中无法访问 Companion 对象的方法的问题。 应该省略new关键字。 文件指出:

伴生对象及其成员只能通过包含类名访问,而不能通过包含类的实例访问。

因此,如果您有这样的课程:

class MyClass {
    companion object {
        fun create() {}
    }
}

您可以像这样调用伴随对象的方法:

MyClass.create()

但不是这样:

new MyClass.create

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM