2012-01-10 9 views
1

メソッドシグネチャに初めて...を見ました。メソッドシグネチャには何がありますか

.classファイルにアクセスしようとしました。それは以下のように定義されたメソッドを持っています

public void addGraphData(GraphData... _graphData) { 
} 

そして、このGraphDataはゲッターとセッターを持つPOJOだけです。 .classファイルがGraphData _graphDataの代わりにGraphData... _graphDataと表示されるのはなぜですか?

+0

が重複する可能性は(http://stackoverflow.com/questions/1656901/varargs-and-the-argument) –

答えて

3

それはvarargsだと唯一のパラメータリストで最後に使用され得ます。最後のパラメータは複数のオブジェクトを保持できます。

public class C { 

    int i; 
    String[] s; 

    public C(int i, String... s){ 
     this.i = i; 
     this.s=s; 
    } 
} 
new C(4,"a","b") // will be transformed to int and String[] 

"a"と "b"がどのように配列に変換されたかを参照してください。

5

機能がVarargs

と呼ばれるそれは、あなたは、メソッドの引数の乱数を供給することができます。

0

公共ボイドaddGraphDataためのこの表記シノニム(GraphData [] _graphData){

}

+1

ないそうではありません。それはほとんど*ですが、あなたは 'addGraphData()'を呼び出すことができます。その場合、 '_graphData'配列は' null'になります。おそらくあなたが期待しているように、空ではないでしょう。 – user268396

+0

が同意すると、varargsは配列とはいくつかの点で異なりますが、ほぼ同じです:) – mishadoff

0

は、Javaでvarargsを示します。 [vararg]属性は、メソッドが可変数のパラメータを取ることを指定します。

[vararg [, optional-attributes]] return-type function-name(
[optional-param-attributes] param-list, 
SAFEARRAY(VARIANT) last-param-name); 

可変引数の構文は基本的に右、あなたは可能なパラメータがあることを指定できます。これを実現するために、最後のパラメータは、残りのすべてのパラメータが含まれているVARIANT型のセーフ配列でなければなりませんか?彼らはそこにいても、そこにいてもいけません。それが3つの点の目的です。メソッドを呼び出すと、それらのパラメータの有無にかかわらず呼び出すことができます。これは、メソッドに配列を渡す必要を避けるために行われました。

thisを見てください:

は、それはvarargsは基本的にメソッドのオーバーロードで推奨されていない、このような理由のためだWhen do you use varargs in Java?

final public class Main 
{ 
    private void show(int []a) 
    { 
     for(int i=0;i<a.length;i++) 
     { 
      System.out.print(a[i]+"\t"); 
     } 
    } 

    private void show(Object...a) 
    { 
     for(int i=0;i<a.length;i++) 
     { 
      System.out.print(a[i]+"\t"); 
     } 

     System.out.println("\nvarargs called"); 
    } 

    public static void main(String... args) //See also here. 
    { 
     int[]temp=new int[]{1,2,3,4};    

     Main main=new Main(); 
     main.show(temp); 
     main.show();   //<-- This is possible. 
    } 
} 

を参照してください。


System.out.printf();varargsの一例であり、以下のように定義されます。

public PrintStream printf(String format, Object ... args) 
{ 
    return format(format, args); 
} 

フォーマット -形式の文字列構文

引数に記載されているようにフォーマット文字列 - 書式文字列内のフォーマット指定子によって参照引数。書式指定子よりも引数が多い場合、余分な引数は無視されます。引数の数は可変であり、ゼロかもしれません。引数の最大数は、Java仮想マシン仕様で定義されているJava配列の最大次元によって制限されます。ヌル引数の動作は変換によって異なります。

0

...は、可変長パラメータリストを示す。 [可変引数と '...' 引数]の

printStrings(String... s){ 
    //internally s is an array with the parameters 
    for(int i = 0; i < s.length;++i) 
     System.out.print(s[i]); 
} 

printStrings("A","B","C","D"); 
//this is done by the compiler 
printStrings(new String[]{"A","B","C","D"}); 
関連する問題