2016-06-30 4 views
11

Javaクラスの1つを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の場合は良いことでした。しかし、ないKotlinでMainApplication、上記のコードのエラー

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

がどのように私は上記の私のJavaコードでgetにアクセスすることができるとき?

答えて

15

あなたはKotlinは、静的メソッドを生成するためにコンパニオンオブジェクトのメソッドに@JvmStatic注釈を追加することができます。

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用の静的メソッドを生成することによって、を複製します。個人的には、これは偉大ではないと思うし、ユースケースによっていくつかの意味があります。

+0

いいです。 2つの方法があるように見えます。私たちが変更できる側(kotlinまたはjava)によって異なります。 – Elye

+0

KotlinをJavaと互換性を持たせなければならない可能性が高いことを考えると、これを 'the'の答えにしてください。 (つまり、JavaからKotlinに変換し、JavaコードではなくKotlinコードで作業する可能性の高い人々)。 – Elye

+1

もう一つの答え(私)、すなわち 'MainApplication.Companion.get(mContext);'を使っても良い答えです:) – Elye

9

オペレーション、それを得ました。ちょうど以下を使用してください。

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

デフォルトの「コンパニオン」名が気に入らない場合は、コンパニオンオブジェクトに名前を付けることもできます。 –

0

コンパニオンオブジェクトの名前を省略すると、メソッドにアクセスするために名前Companionを使用する必要があります。

例:

MyClass1.method1() 

秒を起動するには:

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

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

あなたが次のことを行うだろう最初のコンパニオンオブジェクトのメソッドを呼び出すために

MyClass2.Companion.method2() 

が上Kotlinのドキュメントを参照してください。詳細はCompanion Objectsをご覧ください。

+0

Kotlin 1.1.50現在、 'companion'キーワードを省略してコンパニオンオブジェクトの関数を呼び出すことができます – Xkill01

+0

Javaからコンパニオンオブジェクトを呼び出していて、名前がない場合は使用しないでください。 – Mike

関連する問題