2014-11-05 54 views
6

type erasure page爲什麼這個類型參數保存在字節碼中?

在泛型類型與他們的區域或對象替換所有類型的參數,如果該類型參數是無限的。因此,生成的字節碼只包含普通的類,接口和方法。

然而,對於下面的類:

public class Foo<E extends CharSequence> { 
    public E something; 
} 

javap -c Foo打印:

public class Foo<E extends java.lang.CharSequence> { 
    public E something; 
} 

爲什麼類型參數不符合綁定(CharSequence的)取代,但保留爲E?

回答

7

您打印的內容不是字節碼。這是方法簽名。它被放在那裏,所以編譯器可以在編譯調用它的其他類時強制執行類型安全。

2

類型信息保存在類和方法上,但不保存在實際變量上。如果你寫

class Foo extends Bar<String> { 
} 

...你可以在運行時提取Bar<String>,但如果你有

new Bar<String>(); 

...你可以提取Bar<String>那裏。

0

該類型參數被保留,因爲它必須是子類別已知的。 定義

public class Foo<E extends CharSequence> 

public class Foo<CharSequence> 

是不相等的,因爲後者不會讓子類中聲明,說:

public class MyStringFoo extends Foo<String> { } 

而前者一樣。