CoreJava第12章汎用型


1.タイプパラメータ:より読みやすく、安全性
a)あるインタフェースがクラスであることを確認し、インタフェース(extendsがサブクラス概念に近い)
b)クラスは第一にして、一つしかなくて、インタフェースは複数にすることができる
2.ワイルドカードのタイプ(一方向のみの呼び出しを制限可能)
3.

public class Pair<T> {

	private T a;

	public Pair(T a) {
		this.a = a;
	}

	public T getA() {
		return a;
	}

	public void setA(T a) {
		this.a = a;
	}

	public static void main(String[] args) {
		Pair<String> a = new Pair<String>("testttt");
		System.out.println(a.getA());
	}

}

4.T U,Sは任意のタイプ,ボディキー,value,集合要素を表す
5.汎用方法

public static <T> T test(T[] in){
  return in[in.length/2];
}
//   ClassA.test(..)  ClassA.<String>Test(...);

5.仮想マシンは汎用型がなく、すべて普通のクラスである
a)汎用型を定義し、元の型(raw type)を提供する
b)消去タイプ変数,置換限定タイプ(不要Object,ある場合は最初のタイプ)
6.汎用表現の翻訳
a)元のメソッド呼び出し
b)強制転換、安全転換
c)ブリッジ法導入、マルチステート実装
7.パラメータ名が同じで、戻り値が異なることは許されないが、仮想マシンは認識できる
j2se5.0メソッドオーバーライドは、より厳密な戻りタイプを返すことができます.
8.制限
a)基本タイプでタイプパラメータを作ることはできません(消去は少なくともObjectを含む必要があります)
b)運転時タイプ検出は元のタイプにのみ適用する
if(a instanceOf Pair)//or Pair
Pair a=Pairb;
a.getClass-->Pair.class
c)投げ出すことができず、汎用インスタンス(Throwable)を捕獲することができず、catch(T e)で
public class Problem extends Throwable//illegal
public class Problem//legal異常タイプ
d)パラメトリック型配列不正Pair[]..配列記憶タイプ(component type)
推奨ArrayList>
e)タイプ変数a=new T()をインスタンス化できない;
T.class不正Classc宣言
f)配列をプライベートドメインとする
public class ArrayList{
  private Object[] elements;//E[]
  public E get(int n){
    return (E)elements[n];//cast
  }
  public void set(int n,E e){
    elements[n]=e;//elements[n]=(E[])new Object[10];
  }
}
//object->stringで問題が発生
T[] mm=(T[])Array.newInstance(a.getClass.getComponentType,2);//≪インスタンス|Instance|emdw≫
g)帯域型変数禁止静的ドメイン/メソッド(タイプ消去)
h)消去後の衝突に注意boolean equals(T value)
2つのインタフェースを継承した祖先が同じインタフェースを使用できない場合、ブリッジが競合する可能性があります.
g)型変数の継承関係なしPairPairはPairに含めることができる
配列は関係を継承し、値を割り当てることができます(マルチステート)
h)継承可能
9.ワイルドカードのタイプパラメータ