タイプ消去の簡単な理解

17264 ワード

  • 汎用型はJDK 1.5が導入したものです.
  • 汎用情報はコンパイルフェーズのみ存在し、JVMに入る前に汎用に関する情報は消去される.一般的に言えば、汎用クラスと一般クラスはjava仮想マシン内に特別な場所はありません.

  • 例1:説明タイプ消去
    public class TestMessage{
    
        public static void main(String[] args) {
    
            Message<String> message = new Message<>();
            Message<Integer> message1 = new Message<>();
    
            System.out.println(message.getClass() == message1.getClass());  //true
            System.out.println(message.getClass().getName());  //www.csdn.point.Message
            System.out.println(message1.getClass().getName()); //www.csdn.point.Message
    
        }
    
    }
    
    class Message<T> {
        private T message;
    
        public void setMessage(T message){
            this.message = message;
        }
    
        public T getMessage(){
            return this.message;
        }
    
        @Override
        public String toString() {
            return "TestMessage{" +
                    "message=" + message +
                    '}';
        }
    }
    
    

    以上の結果は,両方のタイプが一致し,タイプが消去された後もMessageであることを示している.例2:タイプ消去後、フィールド情報を表示
    //       ,         
    public class Point2<T> {
        private T x;
        private T y;
    
        public void setX(T x) {
            this.x = x;
        }
        public T getX(){
            return x;
        }
    
        public void setY(T y) {
            this.y = y;
        }
    
        public T getY() {
            return y;
        }
    
        @Override
        public String toString() {
            return "Point2{" +
                    "x=" + x +
                    ", y=" + y +
                    '}';
        }
    
        public static void main(String[] args) {
           Point2<Integer> p2 = new Point2<>();
           //    
            Field[] fields =  p2.getClass().getDeclaredFields();
            for (Field field:fields){
                System.out.println(field.getType().getName());
            }
        }
    }
    
    
  • タイプが消去されると、両方のプロパティのタイプがObjectタイプになります.
  • 汎用クラスがタイプ消去されている場合、以前の汎用クラスのタイプパラメータに上限が指定されていなければ、のように通常のObjectタイプに変換され、上限がのように指定されている場合、タイプパラメータはタイプ上限に置き換えられます.

  • 例:上限タイプ
    public class Point6 <T extends CharSequence>{
        private T x;
        private T y;
    
        public void setX(T x){
            this.x = x;
        }
        public T getX(){
            return this.x;
        }
    
        public void setY(T y){
            this.y = y;
        }
        public T getY(){
            return this.y;
        }
    
        @Override
        public String toString() {
            return "Point6{" +
                    "x=" + x +
                    ", y=" + y +
                    '}';
        }
    
        public static void main(String[] args) {
            Point6<String> p1 = new Point6<>();
            //    
            Field[] fields = p1.getClass().getDeclaredFields();
            for(Field field: fields){
                System.out.println(field.getType().getName());  //java.lang.CharSequence
            }
    
        }
    }
    

    以上の結果では,2つの属性x,yのタイプはいずれもCharSequenceである.