2

これは正常にコンパイルされています:-

public class Demo {

    public static void main(String... args) {

    }
}

しかし、これはコンパイルされていません。

public class Demo {

    public static void main(String... args) {
        String... strVarArgs ;

        //here i initiallize strVarArgs by some logic, like we do for arrays
    }
}

私が構文的に間違っている場合、Plzは私を訂正します。:-)


cletusは次のように書いています:-それは実際には配列の単なる構文糖衣です

これは、キャシー・シエラとバート・ベイツによって書かれた非常に人気のあるJavaの本(Head First Java、第2版、McGraw-Hill / Osborne)からのステートメントが続く例です :-

トピックジェネリック、

<T extends MyClass>、ここでMyClassはクラスであり、

<T extends MyInterface>、ここでMyInterfaceはインターフェースです。

以下は本からのコピーです(548ページ、16章):-

ジェネリックスでは、「拡張する」とは「拡張または実装する」という意味です??? Javaエンジニアは、パラメータ化された型に制約を課す方法を提供する必要がありました。これにより、に制限することができます。ただし、特定のインターフェイスを実装するクラスのみを許可するように型を制約する必要もあります。したがって、これは、継承と実装の両方の状況で機能するために1種類の構文が必要な状況です。言い換えれば、それは拡張と実装の両方で機能します。そして、勝利の言葉は...拡張します。ここで「extends」を使用して行ったように、サンエンジニアが既存のキーワードを再利用する機会があるときはいつでも、通常はそれを行います。しかし、選択の余地がない場合もあります...(アサート、列挙型)。

MyQuestion:var-argsは配列の単なる構文糖衣であり、配列以外の機能はありませんか?

4

2 に答える 2

3

はい、varargsは関数の引数にのみ適用されます。

これは実際には配列の単なる構文糖衣なので、次の代わりに:

String... strVarArgs ;

あなたが欲しい

String strVarArgs[];
于 2009-10-03T17:54:01.097 に答える
1

例:

public class VargArgsExample {

public static void printArgs(long requiredLongArgument, String... notRequiredStringArray) {
    System.out.println(requiredLongArgument);
    if (notRequiredStringArray != null) {
        for(String arg: notRequiredStringArray) {
            System.out.println(arg);
        }
    }
}

public static void main(String[] args) {
    printArgs(1L);
    printArgs(1L, "aa");
    printArgs(1L, "aa", "bb");
}

}

ご覧のとおり、この構文シュガーにより、varargs 引数を指定せずにメソッドを呼び出すことができます。vararg 引数が渡されない場合は、null になります。

変数宣言の別の方法では必要がないため、使用されません。それがコンパイル時エラーが発生する理由です。

于 2009-10-03T18:24:25.320 に答える