メソッド宣言を検討してください。
String.format(String, Object ...)
Object ...
引数は、Object
sの配列への単なる参照です。 実際のObject
配列への参照でこのメソッドを使用する方法はありますか?...
引数にObject
配列を渡す場合-結果の引数値は2次元配列になります-Object[]
自体がObject
であるため:
Object[] params = ....; // Make the array (for example based on user-input)
String s = String.format("%S has %.2f euros", params);
したがって、配列の最初のコンポーネント(String.format
メソッドで使用される)は配列になり、以下を生成します。
[class.getName() + "@" + Integer.toHexString(hashCode())]
配列サイズが1であるため、エラーが発生します。
boldシーケンスが本当の問題です。
これは2番目の質問です。...
配列/パラメーターには名前がありますか?
varargsのドキュメント から:
最後のパラメーターの型の後の3つのピリオドは、最後の引数が配列または引数のシーケンスとして渡される可能性があることを示します。
そのため、複数の引数または配列を渡すことができます。
以下はうまく機能します:
class VarargTest {
public static void main(String[] args) {
Object[] params = {"x", 1.2345f};
String s = String.format("%s is %.2f", params);
System.out.println(s); // Output is: x is 1.23
}
}
配列を渡すだけです:
public void foo(String... args) {
}
String args[] = new String[10];
foo(args);
あなたが説明している状況は非常にまれです:ほとんどの場合、varargsアイテムはString
s、または数字、またはWidget
s ...になることはまれですObject
s(何でもかまいません)または配列。
しかし、varargs引数isObject
sの束または配列型の場合、疑問が発生します。単一の配列を渡すことができ、コンパイラが意図したことをどのように認識するか配列(指定した配列)、または配列にPUTする必要がある一連の1項目を渡すには?
簡単なテストで答えがわかります。
public class TestClass {
public static void main(String[] args) {
Object anObject = new Object();
Object[] anArray = new Object[] {anObject, anObject};
System.out.println("object1 = " + anObject);
System.out.println("array1 = " + anArray);
takesArgs();
takesArgs(anObject, anObject);
takesArgs(anArray); // is this the same as array1?
takesArgs(anArray, anArray);
}
public static void takesArgs(Object... stuff) {
System.out.println("The array was " + stuff);
}
}
実行の結果(正確な数は異なります:
object1 = Java.lang.Object@3e25a5
array1 = [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@addbf1
The array was [Ljava.lang.Object;@42e816
The array was [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@9304b1
答えは、あいまいな場合には、新しい配列を作成してラップするのではなく、渡されたものを配列として扱うということです。これは、他の解釈が必要な場合は常に自分で配列にラップできるため、理にかなっています。