Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中访问Kotlin companion对象?_Java_Kotlin - Fatal编程技术网

如何在Java中访问Kotlin companion对象?

如何在Java中访问Kotlin companion对象?,java,kotlin,Java,Kotlin,我将我的一个Java类转换为Kotlin,并将该类转换为如下所示 class MainApplication : Application() { companion object { operator fun get(context: Context): MainApplication { return context.applicationContext as MainApplication } } } 它有一个静态函数

我将我的一个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);
当main应用程序使用Java时,这很好。但不是当MainApplication在Kotlin中时,上面的代码错误

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

如何在上面的Java代码中访问
get
。只需使用下面的选项

MainApplication application = MainApplication.Companion.get(mContext);
您可以在companion对象中向方法添加注释,以使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生成一个静态方法(除了伴生对象上的方法之外)来复制它。就我个人而言,我认为这并不好,它可能会根据用例产生一些影响,因此值得了解。

通过省略伴星对象的名称,必须使用伴星对象的名称来访问这些方法

例如:

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

class MyClass2 {
    companion object {
        fun method2 {
        }
    }
}
要调用第一个伴生对象方法,请执行以下操作:

MyClass1.method1()
要调用第二个命令:

MyClass2.Companion.method2()

有关详细信息,请参阅上的Kotlin文档。

如果在方法调用中使用了
new
关键字,您可能会遇到无法访问Java中伴生对象的方法的问题。应省略
new
关键字。各国:

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

所以,如果你有这样一门课:

class MyClass {
    companion object {
        fun create() {}
    }
}
您可以这样调用伴生对象的方法:

MyClass.create()

但不是这样:


新建MyClass。创建一个漂亮的MyClass。看起来有两种方法。这取决于我们可以改变哪一方(kotlin或java)。勾选这个作为“答案”,因为人们更可能需要使kotlin与java兼容,而不是相反。(即人们可能会从Java转换到Kotlin,并使用Kotlin代码而不是Java代码)。另一个答案(我的答案)即使用
MainApplication.Companion.get(mContext)
也是一个很好的答案:)根据官方文档:在这个场景中应该使用
@JvmField
,而不是
@JvmStatic
@JvmField用于属性,而不是函数。请参见,如果您不喜欢默认的
companion
名称,也可以命名companion对象。从Kotlin 1.1.50开始,您可以通过省略
companion
关键字来调用companion对象的函数,而不是从Java调用companion对象,并且它没有名称。我必须使用
MyClass1.Object1.method1()
,但是这个效果最好,谢谢!