私はJava
とKotlin
のクラスが混在しているので、私はJava
クラスからcompanion objects
をどのように参照することができるか知りたいと思っています。Javaのコンパニオンオブジェクトへの参照を作成するにはどうすればよいですか?
3
A
答えて
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アノテーションをよく知っておくことをお勧めします。
関連する問題
- 1. オブジェクト参照を作成するにはどうすればよいですか?
- 2. C#別のクラスのリストへの参照を作成するにはどうすればよいですか?
- 3. wpfリソースのパブリッククラスへの参照を作成するにはどうすればよいですか?
- 4. アセンブリ参照のソースコードへの参照を追加するにはどうすればよいですか?
- 5. javaのテキストファイルをどのように参照すればよいですか?
- 6. コンパニオンオブジェクトのメソッドを汎用クラスでどのように参照できますか?
- 7. 既存の2つのクラス間で参照を作成するにはどうすればよいですか?
- 8. コンパニオンオブジェクトのScalaSigを取得するにはどうすればよいですか?
- 9. Baqend Dashboardの[データ]タブにサンプル参照リストを作成するにはどうすればよいですか?
- 10. 呼び出すオブジェクトを参照するメソッドを作成するにはどうすればよいですか?
- 11. 自己参照データ階層用のグラフ・スキーマを作成するにはどうすればよいですか?
- 12. メソッド参照のリストを作成するにはどうすればよいですか?
- 13. File.streamの分散参照を作成するにはどうすればよいですか?
- 14. プロジェクト間の参照グラフを作成するにはどうすればよいですか?
- 15. ラムダの「参照」を作成するにはどうすればよいですか?
- 16. Pythonでオブジェクトに弱参照を作成するにはどうすればよいですか?
- 17. コンテナのIDからGoogleマップオブジェクトへの参照を取得するにはどうすればよいですか?
- 18. WebAssemblyでテーブルを作成して参照するにはどうすればよいですか?
- 19. Sequelizeで自己参照外部キーを作成するにはどうすればよいですか?
- 20. クエリダイアログの参照に参照を挿入するにはどうすればよいですか?
- 21. CALでは、モジュールインスタンスへの参照を取得するにはどうすればよいですか?
- 22. ASP.NETでデフォルト以外のProfileBaseへの参照を取得するにはどうすればよいですか?
- 23. 別のAS3ファイルでムービークリップへの参照をリンクするにはどうすればよいですか?
- 24. 同じソリューションで別のプロジェクトへの参照を追加するにはどうすればよいですか?
- 25. C#アプリケーションでCベースのDLLへの参照を追加するにはどうすればよいですか?
- 26. 参照ベクトルを使用して構造体を作成するにはどうすればよいですか?
- 27. Javaオブジェクトへの循環参照を取り除くにはどうすればいいですか?
- 28. PreferencesActivityクラスからcontentViewへの参照を取得するにはどうすればよいですか?
- 29. GWT:RootPanelからボタンへの参照を取得するにはどうすればよいですか?
- 30. ユーティリティファイルからServer.MapPathへの参照を取得するにはどうすればよいですか?
コンパニオン・インスタンスからスタティック・リファレンスに変換しない限り、これは少し誤解を招くので、注釈をまったく使用する必要はありません。コンパニオンオブジェクトに直接アクセスできることを明確にしてから、OPTIONを使用して注釈をさらに制御する必要があります。 –
例は、Javaから(アノテーションなしの方法を含めて)アクセスするさまざまな方法を示しているので、これがどういう意味で誤解を招くのか分かりません。また、Javaの静的クラス(通常は既存のコードベースを使用している場合)のように作業したい場合は、注釈を付ける必要があります(またはconst/lateinit )。代わりに.Companionを挿入するためにすべてのJavaコードを実行しています。 .Companion.get ...これはJavaからKotlinへの移行をできるだけ面倒にする良い方法です。 –
開かれた文章ですが、注釈を使用すると相互作用するだけのように見えます。後のサンプルは他のケースを示していますが、オープナー(私が読んだところでは)は1つのパスしか利用できないようです。他の人はそれを別々に読むかもしれませんが、多分もっとはっきりと開くかもしれません。 –