CoreJava第12章汎用型
1.タイプパラメータ:より読みやすく、安全性
a)あるインタフェースがクラスであることを確認し、インタフェース(extendsがサブクラス概念に近い)
b)クラスは第一にして、一つしかなくて、インタフェースは複数にすることができる
2.ワイルドカードのタイプ(一方向のみの呼び出しを制限可能)
3.
4.T U,Sは任意のタイプ,ボディキー,value,集合要素を表す
5.汎用方法
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.ワイルドカードのタイプパラメータ
a)
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は任意のタイプ,
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
Pair
a.getClass-->Pair.class
c)投げ出すことができず、汎用インスタンス(Throwable)を捕獲することができず、catch(T e)で
public class Problem
public class Problem
d)パラメトリック型配列不正Pair
推奨ArrayList
e)タイプ変数a=new T()をインスタンス化できない;
T.class不正Class
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)型変数の継承関係なしPair
配列は関係を継承し、値を割り当てることができます(マルチステート)
h)継承可能
9.ワイルドカードのタイプパラメータ