JAVAでのパラメータ問題

3885 ワード

一.可変パラメータ
以前javaにパラメータが...ある場合に遭遇しましたが、これはjavaの可変パラメータで、つまりjavaのメソッドのパラメータは実は可変です.
A.mainメソッドは以下のように書くことができ、このメソッドと(String[]args)は同じメソッドと見なすことができ、同時に存在することはできない.
public static void main(String... args){}
であり、この方法は呼び出し時に呼び出し方法を使用することができる.
main();
main(null);
main(null,null);
main(null,null,null);
......
main("a");
main("a","b");
main("a","b","c");
......
main(new String[]{});
(String...はString*に一致し、nullは特殊なStringであってもよい)
B パラメータの位置...のパラメータは最後のパラメータしか使用できません.そうしないと、あなたが呼び出したとき、ポイントがどの実パラメータに一致するか誰が知っていますか?
public static void main(String[] args,int index)//  
public static void main(String... args,int index)//  !

C重荷
次の2つの方法があるとします.
public static void main(String... args)//  1
public static void main(String a,String... args)//  3
  文法的には、このリロードにはまったくエラーがなく、eclipseもエラーを報告していません.しかし、呼び出し時に使用するパラメータの個数がこれらの方法のポイントパラメータの前のパラメータの個数より大きい場合、eclipseはこのエラーを発見します.言いにくいのではないでしょうか.へへ~やはり例を挙げて言いましょう.以上の2つの方法は,呼び出すと
  main();
  コンパイラはこの呼び出しがメソッドであることを認識します.
  main("");
  コンパイラは気が狂った...1つのStringパラメータが、メソッド1のポイントにも、メソッド3のString+ポイントにも合致するため、コンパイラはどのメソッドを呼び出すか分からない.
  String[]パラメータにはこのような問題はない.
  だからリロードする时注意して、もし点のパラメータの前にそのタイプと同じパラメータがあるならば...最も良い方法は、配列の形式を取り替えるようで、あるいは方法に名前を変えましょう.
D汎用アウトソーシング
例としてjava.util.Arraysはツールクラスであり、すべての方法は静的であり、配列の操作である.中にはタイプTの配列をList<に変換する方法asList(T...args)がある.これは非常に有用な方法であり、ほとんどの場合、あなたが望むようにすることができる.しかし、以下の方法int[is=...//カスタム配列を試してみると、あるいはどこから取得した配列Listlist=Arrays.asList(is);残念ながら、実行はもちろん、コンパイルも通じません.間違いの意味は、ListをListに変換できないということです.分かりましたか?あなたの考えでは、int[]の各要素をT...の各点に対応させると、コンパイラはそう思いません.intは元のタイプで、Objectのサブクラスではありません.汎用TにはT extends Objectが隠されています.したがって、コンパイラはintをTと見なさず、int[]をT点と見なさないことができます.javaは元のタイプを自動的にアウトソーシングクラスにパッケージすることをサポートしていますが、しかし、それは単一の場合です.配列(どんなタイプでも)は特殊なタイプで、Objectのサブクラスなので、コンパイラはint[]全体がTに対応していると思っています.あなたが呼び出す方法はasList(int[]...args)で、あなたが想像していたasList(Integer...)ではありません.
参照ドキュメント:http://hi.baidu.com/rcpsbwudesblmod/item/04b154d0b6054c94270ae766
二汎型の中の?の用途
次は親と子です.
// Parent
 public   class  Parent  {
  //  your code 
 } 
 
// Child
 public   class  Child  extends  Parent {
 //  your code 
 }
再呼び出しの場合
public   class  Test  {
     public   static   void  doTest(List < Parent >  list) {
        
    } 
      public static void  main(String[] args) {
        List < Parent >  parentList  =   new  ArrayList < Parent > ();
        List < Child >  childList  =   new  ArrayList < Child > ();
        doTest(parentList);
        //          
        doTest(childList);
        
    } 
}
コンパイルエラーが検出されますが、Childの集合クラスはParentの集合クラスの代わりに使用できますが、コンパイラが認めていないため、2つの集合クラスの間に直接的な継承関係がないためです.もし実現したら?Jdk 1.5のSourceで答えを見つけ、汎用クラスを探して、点を入れると汎用定義が見えます.例えばArrayList  HashMap  などなど.
コードを次のように変更します.
public   class  Test  {
      //       ,          
      public   static   void  doTest(List <?   extends  Parent >  list) {
        
    } 
      public   static   void  main(String[] args) {
        List < Parent >  parentList  =   new  ArrayList < Parent > ();
        List < Child >  childList  =   new  ArrayList < Child > ();
        doTest(parentList);
        //                 
        doTest(childList)    } 
}

参照ドキュメント:http://www.blogjava.net/dreamstone/archive/2007/02/10/99195.html
まとめると、ここでは主にjdk 1.5以降の一般的ではないパラメータ方法、例えば可変パラメータ点や汎用疑問符の使い方です.