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

时间:2016-06-30 10:29:21

标签: java kotlin

我将我的一个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中时很好。但不是当MainApplication在Kotlin中时,上面的代码错误

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

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

4 个答案:

答案 0 :(得分:31)

您可以在随附对象的方法中添加@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生成静态方法。我个人认为这不是很好,它可能会有一些影响,具体取决于一个用例,所以值得了解。

答案 1 :(得分:16)

Ops,我明白了。请使用以下内容。

  06-30 04:46:15.291 4866-4866/com.your_company.test E/AndroidRuntime: FATAL EXCEPTION: main
                 Process: com.your_company.test, PID: 4866
    java.lang.UnsatisfiedLinkError: Couldn't load MyGame from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.your_company.test-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.your_company.test-2, /vendor/lib, /system/lib]]]: findLibrary returned null
                     at java.lang.Runtime.loadLibrary(Runtime.java:358)
                     at java.lang.System.loadLibrary(System.java:526)
                     at org.cocos2dx.lib.Cocos2dxActivity.onLoadNativeLibraries(Cocos2dxActivity.java:246)
                     at org.cocos2dx.lib.Cocos2dxActivity.onCreate(Cocos2dxActivity.java:260)
                     at android.app.Activity.performCreate(Activity.java:5231)
                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
                     at android.app.ActivityThread.access$800(ActivityThread.java:135)
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
                     at android.os.Handler.dispatchMessage(Handler.java:102)
                     at android.os.Looper.loop(Looper.java:136)
                     at android.app.ActivityThread.main(ActivityThread.java:5017)
                     at java.lang.reflect.Method.invokeNative(Native Method)
                     at java.lang.reflect.Method.invoke(Method.java:515)
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                     at dalvik.system.NativeStart.main(Native Method)

答案 2 :(得分:3)

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

示例:

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

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

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

MyClass1.method1()

调用第二个:

MyClass2.Companion.method2()

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

答案 3 :(得分:0)

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

  

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

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

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

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

MyClass.create()

但不是这样:

new MyClass.create