を選択し、配列を可変引数なぜここに2つの異なる出力があるのかという疑問があります。
Integer[]
は、Object
とObject[]
の両方に暗黙的にキャストできます。オーバーロードは、私は2つのオーバーロードされたメソッドを持っている方法
答えて
これは基本的にコンパイラの中で最も具体的なメソッドを呼び出すことを決定します。
あなたはvaragsで指定され、それがInteger[][]
引数とObject[][]
のparamとない方法でメソッドの呼び出しJVM委譲ため、実行時にfoo(Integer[]... args)
を呼び出します
System.out.println(foo(i));//Object[]... vs Integer[]...
を呼び出します。 Object [] []ではなくInteger [] []でメソッドを呼び出す方がより具体的です。後で声明の中で
あなたはそれがvaragsを使用して再度bar(Object... args)
に行きます
System.out.println(bar(i));//Object... vs Integer[]...
を呼び出すときに、PARAMの種類は[]オブジェクトではなくなりますオブジェクト[] []。コンパイラは、Object... args
を持つ最も具体的なメソッドを呼び出します。
次のとおりvaragsを除去することにより、メソッドのシグネチャを変更する場合:
//Object... vs Integer[]...
public static String bar(Object args) {
return "Object args";
}
public static String bar(Integer[] args) {
return "Integer[] args";
}
を、あなたはそれがメソッドの呼び出しに、より具体的であるとして、それはbar(Integer[] args)
を呼び出すことがわかります。
だから当たり、より正確には、
- SとTの両方の基準型である場合は、[]> T [] IFF S> S T.
- OBJECT>オブジェクト[]
これは整数のコール[]は整数の[] []としない[] []オブジェクトを有する方法について説明することを意味します。 Integer [] []ではなく、Object []に対してInteger []の呼び出しが行われます。
最も具体的な方法を選択するには、hereを参照してください。
最初のケースでは、argsの型は実際はInteger [] []です。つまり、あなたの配列はvarargsによって別の配列に囲まれています。コンパイラはInteger []バージョンを選択します。最も具体的な型です。
2番目のケースでは、args == iとなり、Integer []です。この場合、コンパイラはInteger [] ...バージョンを呼び出すために新しい配列にラップするか、Integer []をObject []にキャストするかのいずれかを選択する必要がありました。それはルールなので、2番目のものを選んだ。
ストーリーのモラルは次のようなものです。varargsメソッドをオーバーロードしないでください。混乱します。
「それはルールです」という仕様のビットを見つけることができますか? –
私は...できますが、OPはすでに彼のコンパイラでそれを証明しています:) –
もし見つけられたら、私はupvoteします。私はそれを解読することに問題があります。 –
- 1. .NET 4.5非同期は、私は非同期メソッドを持って待っていますし、オーバーロードされたメソッド
- 2. 反射によってオーバーロードされたメソッドを見つける方法
- 3. クラスのオーバーロードされたメソッド
- 4. オーバーロードされたostreamと2つのクラスを持つバイナリツリーファイル
- 5. のstd :: result_ofは、オーバーロードされたメソッド
- 6. パスラムダは、私がオーバーロードされた演算子の束を持つクラスを持っているNUnitのテスト
- 7. データフレームのエラー:「選択肢を持つオーバーロードされたメソッド値フィルタ」
- 8. サブクラス&オーバーロードされたメソッド
- 9. (定数)オーバーロードされたメソッド
- 10. オーバーロードされたメソッド(アルドゥイーノ)
- 11. オーバーロードされたオーバーライドされたメソッドを呼び出す方法
- 12. メソッドをvarargsでオーバーロードする方法は?
- 13. TypeScriptでメソッドをオーバーロードする方法は?
- 14. オーバーロードしないメソッドは2つの引数をとる
- 15. メソッド内でメソッドをオーバーロードできない理由(オーバーロードされたクロージャなど)
- 16. オーバーロードされたメソッドを使用してJavaインターフェイスを検証する方法は?
- 17. ELはオーバーロードされたメソッドをサポートしていますか?
- 18. は、私はこれらのオーバーロードと機能を持っているパラメータ
- 19. オーバーロードされたメソッドのデフォルトの引数
- 20. テンプレートクラスのオーバーロードされたメソッドへのポインタ
- 21. spark `reduceGroups`エラー代替方法によるオーバーロードされたメソッド
- 22. オーバーロードされた2つのサブシステムを1つに結合する
- 23. オーバーロードされた演算子のオーバーロード
- 24. オーバーロードされたメソッドのJava動的キャスト
- 25. オーバーロードされたメソッドの汎用関数
- 26. SWIGの型チェックとオーバーロードされたメソッド
- 27. オーバーロードされたメソッドの値+代替方法
- 28. 2つのオーバーロードされたメソッド、同じアクション、重複したコードの原因
- 29. スプリング統合 - オーバーロードされたメソッド
- 30. コード契約オーバーロードされたメソッド
シャーロック[15.12.2.5。最も具体的な方法の選択](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5) – Pshemo
少なくとも、コンパイラの警告が必要です。 –
@Colonel、そうすることができますし、はいできます。試してみるとランタイム例外が発生します。 –