我将我的一个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
?
答案 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