泛型的类型擦除

虚拟机没有泛型类型对象---------所有的对象都属于普通类


java泛型转换的事实:

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

(一)类型擦除与泛型表达式翻译

因为虚拟机是没有泛型的,所以无论何时定义一个泛型类型,都会被擦除类型变量,并替换为限定类型(无限定的变量用Object)

例1.1 Pair 

/**
 * pair类型擦除后 
 * @author xiongda
 * @date 2020年7月11日
 */
public class Pair {
	
	private Object first;
	private Object second;
	
	
	public Pair(Object first, Object second) {
		this.first = first;
		this.second = second;
	}
	
	public Object getFirst() {
		return first;
	}
	public void setFirst(Object first) {
		this.first = first;
	}
	public Object getSecond() {
		return second;
	}
	public void setSecond(Object second) {
		this.second = second;
	}
}

因为 T 是一个无限定的变量,所以会被Object替换

例子1.2  限定类型的类型擦除  Pair

/**
 * Pair 类型擦除后 
 * @author xiongda
 * @date 2020年7月11日
 */
public class Pair{
	
	private Comparable first;
	private Comparable second;
	
}

因为T限定为实现Comparable 接口的类, 所以类型擦除后会使用限定的类型变量Comparable

那么如果限定了多个呢,比如  Pair  ,那么就会取 Serializable,再使用到 Comparable中的compareTo 方法时再插入强制类型转换。 

所以,为了提高效率,标签接口(也就是没有方法实现的接口应该放后面)。

(二) 泛型表达式的翻译

虚拟机是没有泛型的,所以调用泛型方法的时候,会擦入返回类型,编译器再插入强制类型转换。

例2.1 

Pair buddies = new Pair();
Employee buddy = buddies.getFirst();

其实,编译器就把getFirst() 的这个方法调用翻译成了两条虚拟机的指令

  1. 调用原始的getFirst方法, 注意此时返回的是Object
  2. 将返回的Object 进行强制类型转换为 Employee 类型

 

 

 

 

你可能感兴趣的:(java)