java泛型代码的处理

来源:互联网 发布:淘宝游戏币怎么交易 编辑:程序博客网 时间:2024/06/02 04:42

泛型代码和虚拟机

对于虚拟机来说,没有泛型类型对象,所有对象都属于普通类
+ 任何一个泛型类都提供了一个相应的原始类型(原始类型就是删除类型参数后的泛型类型名)
+ 擦除类型变量,并且替换为限定类型(无限定的变量用Object)

在擦除类型的时候如果没有限定类型就用Object,如果有就采用第一个限定类型

Pair 擦除类型后如下所示

    public class Pair{        private Ojbect fisrt;        private Object second;        public Pair(Object first,Object scond){            this.first = first;            this.second = second;        }        public Object getFirst(){            return first;        }        public Object getSecond(){            return sencod;        }        public void setFirst(Object newValue){            first = newValue;        }        public void setSecond(Object newValue){            second = newValue;        }    }

Interval有限定类型擦除后的表达式

  • 未擦除前
    java
    public class Interval<T extends Comparable & Serializable> implements Serializable{
    private T lower;
    private T upper;
    ...
    public Interval(T frist,T second){
    if(first.compareTo(second<=0 )){
    lower = first;
    upper = second;
    }
    }
    }
  • 擦除后的类型

        public class Interval implements Serializable{        private Comparable lower;        private Comparable upper;        ...        public Interval(Comparable frist,Comparable second){            if(first.compareTo(second<=0 )){                lower = first;                upper = second;            }        }                }

    在这里如果我们切换限定: class Interval

翻译泛型表达式

当程序调用泛型方法时,如果擦除返回类型,编译器将插入强制类型转换

    Pair<Employee> buddies = ...;    Employee buddy = buddies.getFirst();

擦除后getFirst的返回类型将返回Object类型.编译器将自动插入Employee类的强制类型转换。编辑器将把这个方法的调用编译为两条虚拟机指定:
1. 将原始方法Pair.getFisrt的调用
2. 将返回的Object类型强制转换为Employee类型

翻译泛型方法

类型擦除也会出现在泛型方法中.

    public static <T extends Comprable> T min(T[] a)

类型擦除后如下

    publci static Comparable min(Comparable[] a)

java泛型转换的事实

  • 虚拟机中没有泛型,只有普通的类方法
  • 所有的类型参数都要用他们的限定类型替换
  • 桥方法被合成来保持多态
  • 为了保持类型安全性,必要时插入强制类型转换
原创粉丝点击