Java汎用

12035 ワード

ここでは一般型の概念と基礎知識を話さず、単純に私の理について一般型の中の
一.
次のコードはパラメータを簡単に使用できます.注釈は正しい解釈です.
package xayd.hjj;

import java.util.ArrayList;
import java.util.List;

class A{}
class B{}
class C{}
class D extends C{}

public class Test extends ArrayList{

        public static  void main(String[] args) {  

        Test testC = new Test();
         // testC = new Test();  //    
        //testC = new Test();   //    
        //        C                   ,      
        
        testC.add(new C());
        //testC.add(new B());       //    ,   C         C  B   
        testC.add(new D());        //    ,              ,           
        
        C testC1 = testC.get(0);
        C testC2 = testC.get(1);    //// D testC3 = testC.get(1);    //    
        D testC4 = (D) testC.get(1); //            ,                 ,         
        System.out.println(testC1); //xayd.hjj.C@2a139a55
        System.out.println(testC2); //xayd.hjj.D@15db9742
        System.out.println(testC4); //xayd.hjj.D@15db9742

        
    }

}

実際にArrayListを継承する目的はaddとgetメソッドを使用してテストすることであり、実際にはaddとgetのようなメソッドを自分で実現することもできます.
ArrayListのaddメソッドとgetメソッドの実装は以下の通りである.
private transient Object[] elementData;  
private int size; 
public boolean add(E e) {  
    ensureCapacityInternal(size + 1);   
    elementData[size++] = e;  
    return true;  
}  


public E get(int index) {  
    RangeCheck(index);  
    return (E) elementData[index];  
}

下には上と少し似たようなコードがあります.次のようになります.
package xayd.hjj1;

import java.util.ArrayList;
class A{}
class B{}

class C{}

class D extends C{}

public class Test extends ArrayList{  //      ArrayList,       ArrayList

    public static void main(String[] args) {
        Test testC = new Test();
        // testC = new Test();//       
        testC.add(new C());
        testC.add(new A());   //          
        testC.add(new B());   //         
        testC.add(new D());
        
        //C objC = testC.get(0);  //      
        Object objC1 = testC.get(0); //    
        C objC2 = (C) testC.get(0); //    
        
        //C objC3 = (C) testC.get(1); //           ,           ClassCastException
        A objC4 = (A) testC.get(1);  //    ,                    A  .
        Object objC5 = (A) testC.get(1); //    
        Object objC6 = (Object) testC.get(1); //    

    }

} 
  
 

   ArrayList 。 Test extends ArrayList, Test extends ArrayList。 , testC add , 。 get ,  C objC3 = (C) testC.get(1), , ClassCastException。

   ArrayList ArrayList ( , ):

  Test extends ArrayList: Test testC = new Test(), Test ArrayList C, add C C 。 add :elementData[size++] = e, elementData Object , T C , Object C ( ), C 。

  Test extends ArrayList: Test testC = new Test(), Test C, ArrayList , Object(public class ArrayList,ArrayList )。 Object , , 。

   . , ArrayList 。 T.

package xayd.hjj2;

import java.util.ArrayList;

class A{}
class B{}

class C{}

class D extends C{}

public class Test{ 
    
        private T obj;
        
        public T getObj() {
            return obj;
        }

        public void setObj(T obj) {
            this.obj = obj;
        }

        public static  void main(String[] args) {
            Test testC = new Test();
            testC.setObj(new C());
            C objC = testC.getObj();
            System.out.println(objC);   //xayd.hjj2.C@2a139a55
            
            
            // testC.setObj(new B());  //    
            
            
            testC.setObj(new D());    //    
            C objC1 = testC.getObj();
            System.out.println(objC1);  //xayd.hjj2.D@15db9742 
    
        }
}

このコードは で で、Testクラスとクラスのメンバー パラメータのタイプは しているので、 なる はありません.