汎用消去タイプ

1638 ワード

仮想マシンには汎用オブジェクトがありません.すべてのオブジェクトは通常のクラスに属します.
JAva汎用変換の事実:
仮想マシンには汎用型はなく、一般的なクラスと方法しかありません.
すべてのタイプパラメータは、を限定タイプで置き換えます.
ブリッジ法を合成して多態を維持する
タイプセキュリティを維持するため、必要に応じて強制タイプ変換を挿入する.
(一)タイプ消去と汎用表現翻訳
仮想マシンには汎用型がないため、いつ1つの汎用型を定義してもタイプ変数は消去され、限定型に置き換えられます(無限定の変数は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のcomparareToメソッドを使用するときに強制タイプ変換を挿入します. 
したがって、効率を向上させるために、ラベルインタフェース(すなわち、実現方法のないインタフェースは後ろに置くべきである).
(二)汎用表現の翻訳
仮想マシンには汎用性がないので、汎用メソッドを呼び出すと、戻りタイプが消去され、コンパイラが強制タイプ変換を挿入します.
例2.1
Pair buddies = new Pair();
Employee buddy = buddies.getFirst();

実は、コンパイラはgetFirst()のこのメソッド呼び出しを2つの仮想マシンの命令に翻訳しました.
  • 元のgetFirstメソッドが呼び出されます.ここではObject
  • が返されます.
  • 返されたObjectを強制型からEmployee型に変換する
  •