2017-05-25 15 views

答えて

1

大丈夫です!あなたのようなものがある場合:

class MyKotlinClass { 

    companion object { 
     val VAR_ONE = 1 
     val VAR_TWO = 2 
     val VAR_THREE = 3 

     fun printOne() { 
      println(VAR_ONE) 
     } 
    } 
} 

をあなたはこの方法であなたのJavaクラスから

public class MyJavaClass { 

    private void myMethod(){ 
      MyKotlinClass.Companion.getVAR_ONE(); 

      //The same for methods 
      MyKotlinClass.Companion.printOne(); 
    } 
} 
0

をフィールドにアクセスすることができましたこれは、コンパニオンオブジェクトとKotlinクラスです。

class A { 
    companion object { 
     @JvmStatic fun foo() {} 
     fun bar() {} 
    } 
} 

JavaからコンパニオンオブジェクトのKotlinクラスを呼び出す:

A.foo(); 
A.Companion.foo(); 
A.Companion.bar(); 
4

あなたは、本質的にそれらを扱うことができるようにKotlinのコンパニオン・オブジェクトは、Javaのと相互運用するために、静的なバッキングフィールドやメソッドを持っています@ JvmStaticと@JvmFieldを使用して)正しく注釈を付けた場合は、静的クラスのようになります。したがって:

class C { 
    companion object { 
     @JvmStatic fun foo() {} 
     fun bar() {} 
    } 
} 

fooは静的関数のようにJavaからアクセスできます。バーはできません。

// Java 
Key.COMPARATOR.compare(key1, key2); 
// public static final field in Key class 

また、CONSTを使用することができます:あなたが次にJvmField

class Key(val value: Int) { 
    companion object { 
     @JvmField val COMPARATOR: Comparator<Key> = compareBy<Key> { it.value } 
    } 
} 

を使用する以外

C.foo(); // works fine 
C.bar(); // error: not a static method 
C.Companion.foo(); // instance method remains 
C.Companion.bar(); // the only way it works 

あなたは、フィールドと同じことを行うことができます。

Javaでは
// file: Example.kt 

object Obj { 
    const val CONST = 1 
} 

class C { 
    companion object { 
     const val VERSION = 9 
    } 
} 

const val MAX = 239 

:核心ザラザラの詳細については

int c = Obj.CONST; 
int d = ExampleKt.MAX; 
int v = C.VERSION; 

Java to Kotlin interop in the documentation(例はすべてコピー&ペーストとにかくそこからのもの)を参照してください。

KotlinからJavaへの対話を円滑にするためには本当に重要なので、Javaと頻繁に相互作用したい場合は、JvmStaticアノテーションとJvmFieldアノテーションをよく知っておくことをお勧めします。

+0

コンパニオン・インスタンスからスタティック・リファレンスに変換しない限り、これは少し誤解を招くので、注釈をまったく使用する必要はありません。コンパニオンオブジェクトに直接アクセスできることを明確にしてから、OPTIONを使用して注釈をさらに制御する必要があります。 –

+0

例は、Javaから(アノテーションなしの方法を含めて)アクセスするさまざまな方法を示しているので、これがどういう意味で誤解を招くのか分かりません。また、Javaの静的クラス(通常は既存のコードベースを使用している場合)のように作業したい場合は、注釈を付ける必要があります(またはconst/lateinit )。代わりに.Companionを挿入するためにすべてのJavaコードを実行しています。 .Companion.get ...これはJavaからKotlinへの移行をできるだけ面倒にする良い方法です。 –

+0

開かれた文章ですが、注釈を使用すると相互作用するだけのように見えます。後のサンプルは他のケースを示していますが、オープナー(私が読んだところでは)は1つのパスしか利用できないようです。他の人はそれを別々に読むかもしれませんが、多分もっとはっきりと開くかもしれません。 –

関連する問題