ディレクトリ
ジェネリック
ジェネリック医薬品の導入
class Apple{
public String color;
public int count;
public int id = count++;
public long id(){
return id;
}
}
class Orange {}
public class AppleAndOrangeWitnoutGenerics {
public static void main(String[] args) {
ArrayList apples = new ArrayList();
for (int i = 0; i < 3; i++) {
apples.add(new Apple());
}
apples.add(new Orange());
for (int i = 0; i < apples.size() ; i++) {
// apples.get(i).id; //会出现语法错误
((Apple)apples.get(i)).id();
}
}
}
私たちは、コードを実行するために多くの時間を見つけるでしょう。あなたはコンテナに任意のオブジェクトを追加できるようにArrayListに保存し、オブジェクトであるとして、それはコンパイラやランタイムかどうかは問題ではありません。そうでない場合は、構文エラーになります、ちょうど取得オブジェクト参照をキャストしなければならない場合、オブジェクトを取得するにはget()メソッドを使用してArrayListに。オレンジ、アップル、このような型変換の例外にキャストすることはできません。実行時に、我々はオレンジ、アップルにオブジェクトを移行しようとすると、スレッド内の「メイン」とjava.lang.ClassCastExceptionが例外を取得します。
使用して、この問題を解決することができ、一般的な事前定義しました。あなたは、AppleがArrayListのオブジェクト定義したい場合は、ArrayListの<アップル>を宣言することができます。Typeパラメータは、角括弧(複数であってもよい)です。
-あなたができるようにコンパイルした容器内に配置されたオブジェクトの間違った種類を防止するため、エラーのコンパイル時に実行時エラー
-時間撮影した要素を、またキャストである必要はありません。リストに自動的に移行彼は保存のタイプを知っているので、(GETを呼び出します)。
一般的な定義
public class MyArrayList<E> {
private E[] array;
...
}
<>は、一般的な象徴である
変数の型、変数名、一般的に資産計上されたE
EはMyArrayListに代わって、定義中のパラメータであり、最終的にはタイプが知られていない渡さ
一般的な意味
public class MyArrayList<T> {
public T[] elem;
public int usedSize;
public MyArrayList() {
//this.elem = new T[10];
this.elem = (T[])new Object[10]; //注意要这样写
this.usedSize = 0;
}
public void add(T data) {
this.elem[this.usedSize] = data;
this.usedSize++;
}
public T get() {
return this.elem[this.usedSize-1];
}
}
我々はこのようなコードを記述する場合:
MyArrayList<String> myArrayList = new MyArrayList<>();
myArrayList.add("Java");
myArrayList.add(2); //报错
String ret = myArrayList.get(); //不用进行强转
そのため、一般的な意味:
1)チェックは、自動タイプであってもよい
2)自動型変換
3、一般的ないくつかのピット:
1)ジェネリック型パラメータは単純型にすることはできません。これは、ラッパークラスのオブジェクトでなければなりません
MyArrayList<int> myArrayList3 = new MyArrayList<>(); //报错
2)配列の新しいジェネリック型にすることはできません
this.elem = (T[])new Object[10]; //注意要这样写
T[] elem = new T[10]; //错误
3)ジェネリック型パラメータは、組成物の種類に関与しません
MyArrayList<String> myArrayList = new MyArrayList<>();
System.out.println(myArrayList); //MyArrayList@16d3586
4、ジェネリック医薬品がコンパイルされていますか:
コンパイラによって実行されるタイプの消去メカニズム(交換しないで)非ジェネリッククラスにジェネリッククラスをアングルブラケットタイプ消去Object型の翻訳。ジェネリック医薬品は、コンパイル時の役割を持っています。コードへの変換のいくつかの種類を持っていない、コンパイラが重要な型チェックになります。
ラッパークラス
1,8パッケージの基本的なデータ型に対応します:
文字に加えて - >文字とint型 - >整数、他の人は資産計上され
2、自動包装/ディスペンサーパッケージは、自動的に開梱/開梱:
//int --> Integer 自动装箱
Integer a = 10;
//手动装箱
Integer b = Integer.valueOf(20);
System.out.println(b); //20
//Integer --> int 自动拆箱
int c = a;
//手动拆箱 还可以是double ...
int d = a.intValue();
System.out.println(b); //10
概要:パッキングコールInteger.valueOf()メソッド(静的)、開梱呼び出しInteger.intValue)法(変数)
整数の3.分析:
Integer a = 100;
Integer b = 100;
System.out.println(a == b); //true
Integer a = 150;
Integer b = 150;
System.out.println(a == b); //false
ワオ......
整数は、比較的等号がアドレスされ、参照型です。そうのvalueOf()メソッドと呼ばれるコードの自動包装、中に行います。valueOf基礎となるコードを参照してください値は-128-127の間の数である場合、各バッファにフェッチします。そうでない場合、私は新しい新しいオブジェクトに行くことはありません。したがって、上記の物質の存在があります。