3

この質問は Android のシナリオに基づいていますが、Java 全般に当てはまります。

Android では、ContentValuesクラスには次のような多くのput()メソッドがあります。

put(String key, Float value)
put(String key, Integer value)

私たちのコードには次のものがあります。

contentValues.put(myKey, myCondition ? Utils.getFloat(something) : Utils.getInt(something));

これが実行されると、常にput(String key, Float value)呼び出されることがわかりました。myConditionこれは、 が満たされていないため、三項演算子が整数値に解決された場合でも発生します。

私たちの場合、これを に置き換えるとif-else問題が解決します。VM が実行するメソッドをいつ、どのように選択するかについての説明を本当に求めています。

これがすでに回答されている場合は、重複としてマークしてください。前もって感謝します!

4

2 に答える 2

3

メソッドのオーバーロードは、実行時ではなくコンパイル時に解決されます。三項式の型はNumber-- おそらくput(String key, Number value)メソッドまたはput(String key, Object value)メソッドがあります。編集:実際にはFloatに強制されているとのことです。JLSでは、これについて詳しく説明しています

他の言語、実行時にオーバーロードを解決します。この機能はdouble-dispatchとして知られています。これは、メソッドが最初に引数の型によって、次に self 型によって二重にディスパッチされるためです。

于 2013-07-16T21:00:00.973 に答える
0

さて、コンパイラ (VM ではない) は最初のメソッドを選択します。これは、式の型が Float であるためです。

myCondition ? Utils.getFloat(something) : Utils.getInt(something)

float 型です ( getFloatfloatを返し、getIntがintを返すと仮定すると、それらがボックス型の場合、式の型がNumberになるため、これは機能しません)。これは、コンパイル時にコンパイラによって型昇格によって決定されます (たとえば、整数式getIntは float 型式に変換されます)。

于 2013-07-16T21:16:12.733 に答える