私が間違っている場合は訂正してください。Boxing +VarargsはBoxing+Wideningよりも優先されますか?
私はその逆のサイトで見つけました。
私が間違っている場合は訂正してください。Boxing +VarargsはBoxing+Wideningよりも優先されますか?
私はその逆のサイトで見つけました。
複数の資格が得られる場合に呼び出されるメソッドは、JLS#15.2.2で定義されています。
最初のフェーズ(§15.12.2.2)は、ボックス化またはボックス化解除の変換、または可変アリティメソッド呼び出しの使用を許可せずに過負荷解決を実行します。このフェーズで該当する方法が見つからない場合、処理は2番目のフェーズに進みます。
2番目のフェーズ(§15.12.2.3)は、ボックス化とボックス化解除を許可しながら過負荷解決を実行しますが、それでも可変アリティメソッド呼び出しの使用を排除します。このフェーズで該当する方法が見つからない場合、処理は3番目のフェーズに進みます。
3番目のフェーズ(§15.12.2.4)では、オーバーロードを可変アリティメソッド、ボクシング、およびアンボクシングと組み合わせることができます。
要約すると、拡大>ボクシング&アンボクシング> varargs
Boxing+VarargsよりもBoxing+Wideningの方が優先されます。簡単なテストで同じことが確認できます。
public static void main(String[] args) {
int i = 2;
doX(2);
}
static void doX(Object i){
System.out.println("object...");
}
static void doX(Integer... i){
System.out.println("int...");
}
プリント:
object...
編集:申し訳ありませんが、私の悪い。コードを修正しました。「オブジェクト...」と入力したことに気づきませんでした。
Boxing + Widening
よりも優先されBoxing + Varargs
ます。これを示すために@Johnの例を変更しました:
public static void main(String[] args) {
int i = 2;
doX(i);
}
static void doX(Object i) {
System.out.println("Object");
}
static void doX(Integer... i) {
System.out.println("Integer...");
}
プリント
Object