Java復習メモ--汎用

13637 ワード

目次
  • 汎用
  • 汎用作用時間
  • 汎用クラス
  • 汎用インタフェース
  • 実装クラス決定タイプ
  • 実装クラス不確定タイプ
  • 汎用方法
  • 重点
  • 汎用ワイルドカード?
  • プライマー
  • ?
  • ?extends A
  • ? super A
  • 汎用配列
  • 補足
  • 汎用型
    汎用型は実は範囲を縮小するので、Javaは内蔵データ型を除いて、その他はすべてObjectで、汎用型をプラスするのはマッチング範囲が小さくなって、範囲は自分で決めます.
    汎型作用時間
    汎用はコンパイル時にのみ使用され、実行時まで保持されません.コンパイルする時、プログラムは汎型化の措置を取って、つまり汎型値はコンパイルの段階で発効して、汎型の結果を正しく検証した後、汎型の関連する結果は解消されて、そして対象が方法の場所に入って離れる場所にタイプの判断とタイプの変換を追加します.
    汎用クラス
    正確な汎用タイプではinstanceof操作は使用できません.例:
    	if(a instanceof A<Integer>) //    
    

    汎用インタフェース
    汎用インタフェースの場合、public interface Testは、特定のimplementsの場合Tが確定しているか不確定か(Tが特定のクラスとして宣言されているかどうか)を根拠に、汎用インタフェースimplementsを2つのクラスに分けます.
  • 実装クラス決定タイプ
  • 実装クラス不確定タイプ
  • 実装クラス決定タイプ
    クラス決定タイプを実装するには、決定タイプのインタフェースメソッドを書き換える必要があります.また、クラスの後ろに宣言汎用を表示する必要はありません.例:
    class Test implements InterfaceTemp<String>{
    	public void Hello(String t){
    		System.out.println("Hello:"+t);
    	}
    }
    

    実装クラス不確定タイプ
    クラス不確定タイプを実装するには、クラスの後ろに宣言汎用型を表示し、不確定なタイプのインタフェースメソッドを書き換える必要があります.例:
    class Test<T> implements InterfaceTemp<String>{
    	public void show(T t){
    		System.out.println("Hello:"+t);
    	}
    }
    

    汎用メソッド
    タイプを返す前に汎用タイプを宣言する必要があります.例:
    	public static  <T> void test( T t){}
    

    クラスで汎用を使用するのは汎用ではありません.次のようにします.
    	public T noTest( T t){} //  (1)  
    

    ここで注意すべき点は、上のnoTestではstaticを追加できないこと、よく理解できますが、staticはクラスのメソッドを表していますが、汎用型はインスタンス化の際に使用されますが、staticを許可すればこのメソッドはどのタイプにマッチするべきですか?
    重点を置く
    汎用のあるクラスで汎用メソッドを使用し、カッコの中の汎用タイプが一致している場合は、汎用メソッドが新しいものを使用しているのは汎用クラスとは関係ありません.次は間違っています.
    public class JavaBlogTest<T>{
    
        public T printMsg( T stra){//    T JavaBlogTest T  
            T result = (T)stra;
            return result;
        }
    
        public static void main(String[] args) {
            JavaBlogTest<String> a = new JavaBlogTest<>();
            Object x = a.printMsg(1);//      
            System.out.println((Integer) x);
        }
    
    }
    
    public class JavaBlogTest<T>{
    
        public <T> T printMsg( T stra){ //    T JavaBlogTest T   ,     
            T result = (T)stra;
            return result;
        }
    
        public static void main(String[] args) {
            JavaBlogTest<String> a = new JavaBlogTest<>();
            Object x = a.printMsg(1);//     
            System.out.println((Integer) x);
        }
    
    }
    

    汎用ワイルドカード?
    リード
    Aに息子Bがいる場合、方法void hello(ArrayListlist);はパラメータとしてArrayListを受信することができますか?答えは:nonono.この問題を解決するために,ワイルドカードを導入し,上下限の特性も導入した.ワイルドカードは、私から見れば正規表現とのマッチングの意味があまり違いません.
    ?
    タイプワイルドカードは、すべてのタイプに一致することに相当します.
    ?extends A
    タイプパスの上限は、一致するAとその子孫クラスに相当します.
    ? super A
    タイプパス下限は、マッチングA、すなわちその祖先類に相当する
    汎用配列
    汎用配列は許可されていません.List[] lsa = new List[10];これはだめです.ただしワイルドカードは使えますが、List>[] lsa = new List>[10];これは可能ですが、具体的に使うときはタイプ変換を使います.例:
    List<?>[] lsa = new List<?>[10]; // OK, array of unbounded wildcard type.    
    Object o = lsa;    
    Object[] oa = (Object[]) o;    
    List<Integer> li = new ArrayList<Integer>();    
    li.add(new Integer(3));    
    oa[1] = li; // Correct.    
    Integer i = (Integer) lsa[1].get(0); // OK 
    

    いくつかの補足
    Q.汎用型のあるクラスを使用する場合、具体的なタイプを与えなかったらどうなりますか.A:特定のタイプが指定されていない場合は、タイプを許容される最大タイプとします.(ワイルドカードがないのがObject、あるのがワイルドカードの上限)