47

メソッド宣言について考えてみましょう。

String.format(String, Object ...)

引数は、sの配列へのObject ...単なる参照Objectです。実際の配列を参照してこのメ​​ソッドを使用する方法はありますか?ObjectObject配列を引数に渡す...と、結果の引数値は2次元配列になります。これObject[]は、an自体が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であるため、エラーが発生します。

太字のシーケンスが本当の問題です。
これは2番目の質問です:配列/パラメータには名前がありますか...

4

3 に答える 3

54

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
  }
}
于 2009-11-01T11:20:34.340 に答える
11

配列を渡すだけです。

public void foo(String... args) {
}

String args[] = new String[10];
foo(args);
于 2009-11-01T11:16:18.177 に答える
8

あなたが説明している状況はかなりまれになります:ほとんどの場合、varargsアイテムはStrings、または数字、またはsになります...それらがs(何でもかまいません)または配列Widgetになることは珍しいでしょう。Object

しかし、varargs引数sの束Objectまたは配列型である場合、疑問が生じます。単一の配列を渡すことができ、コンパイラは、配列(指定した配列)を渡すつもりかどうかをどのように知るのでしょうか。あなたのために配列に入れるべき一連の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

したがって、答えは、あいまいな場合には、渡したものを、それをラップする新しい配列を作成するのではなく、配列として扱うということです。他の解釈が必要な場合は、いつでも自分で配列にラップできるため、これは理にかなっています。

于 2009-11-03T01:27:52.240 に答える