JAVAでのパラメータ問題
3885 ワード
一.可変パラメータ
以前javaにパラメータが...ある場合に遭遇しましたが、これはjavaの可変パラメータで、つまりjavaのメソッドのパラメータは実は可変です.
A.mainメソッドは以下のように書くことができ、このメソッドと(String[]args)は同じメソッドと見なすことができ、同時に存在することはできない.
B パラメータの位置...のパラメータは最後のパラメータしか使用できません.そうしないと、あなたが呼び出したとき、ポイントがどの実パラメータに一致するか誰が知っていますか?
C重荷
次の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
二汎型の中の?の用途
次は親と子です. HashMap などなど.
コードを次のように変更します.
参照ドキュメント:http://www.blogjava.net/dreamstone/archive/2007/02/10/99195.html
まとめると、ここでは主にjdk 1.5以降の一般的ではないパラメータ方法、例えば可変パラメータ点や汎用疑問符の使い方です.
以前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
参照ドキュメント: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コードを次のように変更します.
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以降の一般的ではないパラメータ方法、例えば可変パラメータ点や汎用疑問符の使い方です.