java泛型代码的处理

泛型代码和虚拟机

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

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

猜你喜欢

转载自blog.csdn.net/wolf2s/article/details/78732616