JAvaの概要とjavaの理解(三二)


JAva 5.0の汎用的な説明はjavaのタイプセキュリティを強化し、コンパイル中にコンテナ内のオブジェクトのタイプチェックを行い、実行中にタイプの変換を行う必要はありません.Java se 5.0の前に、コンテナ内のオブジェクトの検査と変換を動的に実行する必要があります.汎用型はコンパイル時の概念で、実行時に汎用型がなく曖昧なコンテナを減らすことができ、どのタイプのデータをコンテナListaList=new ArrayList()に入れるかを定義することができます.aList.add(new Integer(1));//...Integer myInteger = aList.get(0);汎用コレクションをサポートし、作成したタイプ、または指定したタイプのサブタイプのみを保存できます.この簡単な例では、aListを定義する際にIntegerタイプのみを受け入れるArrayListであることを示し、aList.get(0)を呼び出すと、結果をIntegerに明示的に変換してからmyIntegerに値を割り当てる必要はありません.このステップは、以前のJavaバージョンでは必要でした.Collectionを使うときにいくつかのタイプ変換を節約することがJava汎用のすべてだと思いますか?はるかに止まらない.この例だけでは、汎用型の少なくとも1つのより大きな利点は、汎用型のコンテナクラスを使用してより丈夫になることです.以前、Collectionインタフェースのget()とIteratorインタフェースのnext()メソッドは、Objectタイプの結果を返すしかありませんでした.この結果をコンパイル期間のエラーがなく、任意のObjectのサブクラスに強制的に変換することができます.しかし、これは明らかに深刻なランタイムエラーをもたらす可能性が高い.コードの中で、あるCollectionから取り出したオブジェクトがどのタイプのオブジェクトであるかを完全に呼び出し者自身が計算したのかを決定するが、呼び出し者はCollectionに入れたオブジェクトが具体的にどのクラスなのか分からないかもしれない.入れたオブジェクトがどのクラスであるべきかを知っていても、Collectionに入れたオブジェクトがそのクラスのインスタンスであることは保証されません.コンパイラは、Collectionがどのタイプのオブジェクトを受け入れるかを定義するときに指定すれば、類似の問題が製品に漏れるのを避けることができます.私たちは実際の仕事で実際にClassCastExceptionをたくさん見ました.使用法宣言および汎用クラスのインスタンス化:HashMaphm=new HashMap();コンパイルタイプの汎用型と実行時タイプの汎用型は必ず一致しなければならない.多態はない.元のタイプGenListnList=new GenList();コンパイルエラーJava SE 5.0は現在、元のタイプをタイプパラメータ(type parameter)として定義する汎用インタフェースをサポートしていません:public interface GenInterface{void func(T t);}汎用クラスの定義:public class ArrayList{...}public class GenMap{...}例1:
public class MyList<Element> extends LinkedList<Element>
{
public void swap(int i, int j){
Element temp = this.get(i);
this.set(i, this.get(j));
this.set(j, temp);
}
public static void main(String[] args){
MyList<String> list = new MyList<String>();
list.add("hi");
list.add("andy");
System.out.println(list.get(0) + " " + list.get(1));
list.swap(0,1);
System.out.println(list.get(0) + " " + list.get(1));
}
}

 汎用的なワイルドカード「?」は任意のタイプで置き換えられます.汎用ワイルドカードは任意のタイプは、このタイプがサブタイプまたはインタフェースの実装クラスは、このタイプがタイプの親であることを示します.例:汎用ワイルドカード、範囲付き汎用ワイルドカード
import java.util.*;
import static java.lang.System.*;
public class TestTemplate {
/**
* @param args
*/
public static void main(String[] args) {
List<String> l1=new ArrayList<String>();
l1.add("abc");
l1.add("def");
List<Number> l2=new ArrayList<Number>();
l2.add(1.3);
l2.add(11);
List<Integer> l3=new ArrayList<Integer>();
l3.add(123);
l3.add(456);
// print(l1);
print(l2);
print(l3);
}
static void print(List<?> l//     ){
//  Comparable              

for(Object o:l){
out.println(o);
}
}
static void print(List<? extends Number> l//         ){
//  Number           
for(Object o:l){
out.println(o);
}
}
static void print(List<? extends Comparable> l){
//  Comparable              
for(Object o:l){
out.println(o);
}
}
static void print(List<? super Number> l){
//  Number           
for(Object o:l){
out.println(o);
}
}
}

 
「?」は、printメソッドを実装するためにワイルドカードを使用するなど、任意のタイプの代わりに使用できます.public static void print(GenList list) {})