問題タブ [kotlin-interop]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
generics - Kotlin コンパイラの型推論では、呼び出すメソッドを選択できません (ジェネリック型のあいまいさ)
したがって、これらのシグネチャを持つ Java メソッドがいくつかあります (わかりやすくするために、注釈とコード本体を削除しました)。
Kotlin には、「結合」メソッドを呼び出すコードがいくつかあります。
ここまでは順調ですね; varargs を展開し、以前のメソッド シグネチャを呼び出します。おきえドッキー!
たとえば、「セパレータ」引数を使用して後者のメソッド シグネチャを呼び出したい場合に問題が発生します。
このコードはコンパイルされません。コンパイラは、呼び出すメソッドを決定できません。エラー:
エラー:(5, 13) Kotlin: 型推論が完了しないと、次の候補から選択できません: public open fun join(vararg array: String!): String! JavaClass で定義 public open fun join(separator: CharSequence!, vararg array: String!): String! JavaClass で定義
Kotlin では非 Kotlin 関数の引数の名前付けが許可されていないため、引数に名前を付けることさえできません。
編集: Eジェネリック型パラメーターをJava メソッド ヘッダーのプレーンなString参照に置き換えたところ、機能しました! だから私はこれがジェネリック型またはそのようなものとの型推論の非互換性であると思いますか?
これは、スプレッド演算子(*)を使用する必要があると確信しています。しかし、varargs パラメーターarray
をjoin
使用しないと関数に渡すことができません。
Javaコードに触れずにこれを解決するにはどうすればよいですか?
はい、Array.joinToString 拡張関数があることは知っていますが、これはこの特定のケースのみを解決します。一般的な解決策を知る必要があります。
kotlin - while式で代入禁止?
while
Java では、通常、条件内で代入を実行できます。しかし、Kotlinはそれについて不平を言っています。したがって、次のコードはコンパイルされません。
この他のスレッドによると、これが最善の解決策のようです:
しかし、そうですか?
java - Thread/Runnable 実装を Java から Kotlin に変換する
次のようなThreadUtils
メソッドを持つ既存の Java クラスがあります。every
そして、それをKotlinに変換しようとしています。私は Runnable の閉鎖に少し夢中になっています。これは悪い で失敗しますreturn
:
また、物事を分離するのを助けるためだけにRunnableを引き出してみましたが、これも同じように失敗します:
定義されている関数から@FunctionalInterface
実行しようとしない、または同様のスタイルのクロージャー/ラムダを実装するにはどうすればよいですか?return
kotlin - デフォルト コンストラクターで定義された変数のセッターをオーバーライドする
だから私は次のようなKotlinクラスを持っています:
ただし、Android Studio は、これをデフォルトのコンストラクターとして使用できると警告しています。それを選択すると、次のように変わります。
setMyString()
メソッドを呼び出すとコンパイラ エラーが発生するため、setter をオーバーライドする機会がなくなりました。
フィールドがデフォルトのコンストラクターの一部である場合、セッターをオーバーライドする方法はありますか、またはオプション 1 を使用して、表示される警告を無視する必要がありますか?