flexiPrint()
クラスのメソッドをオーバーロードしようとVarargdemo
すると、コンパイル時エラーが発生します。コンパイラは、次の署名を同じように扱います。
public static void flexiPrint(Object... data){}
public static void flexiPrint(Object[] data){}
なぜ彼らが同じように扱われるのか誰かが私に説明できますか?私は答えを見つけることができませんでした。
flexiPrint()
クラスのメソッドをオーバーロードしようとVarargdemo
すると、コンパイル時エラーが発生します。コンパイラは、次の署名を同じように扱います。
public static void flexiPrint(Object... data){}
public static void flexiPrint(Object[] data){}
なぜ彼らが同じように扱われるのか誰かが私に説明できますか?私は答えを見つけることができませんでした。
Object...
は配列に過ぎません。つまり、定義するのと同じです。Object[]
...
(3つのドット)はJavaのvarargsを表します。
通常、このシグネチャは次のようなメインメソッドで表示されますmain(String... args)
そのため、同じシグニチャを持つ複数のメソッドをクラスに含めることはできません(コンパイル時エラー)。これが、コンパイル時エラーが発生する理由です。
それらは「内部」で同じです。varargs(...
)は、配列をパラメーターとして渡します。
複数の引数を配列で渡す必要があるのは事実ですが、varargs機能はプロセスを自動化して非表示にします。さらに、既存のAPIと上位互換性があります。
こちらのドキュメントで見つけることができます。
可変長引数は、Object...
構文糖衣のようなものです。使用する場合、例:
flexiPrint("apple", "peach", "plum");
次に、「apple」、「peach」、「plum」は実際には「Object [] {"apple"、 "peach"、"plum"}」に変換されます。