[英]Confusion with type erasure rule in Java Generics
我有一個疑問,我已經研究了泛型葯物一個小時。 可以說我有一個像這樣的課程:
class Pair<T>
{
public T getFirst() { return first; }
}
基本上我的書是這樣說的:
類型擦除:類型變量被擦除,並由其邊界類型替換(或對象為無邊界變量)。
因此,根據我的書中聲明,JVM中的代碼應類似於:
class Pair
{
public Object getFirst() { return first; }
}
現在,如果我這樣做:
Pair<String> pair = new Pair<>(); //I use Java 7 diamond syntax here.
pair.getFirst()
難道我的代碼需要再次以getFirst
返回類型從Object
轉換為String
嗎?
現在考慮:
ArrayList<String> files = new ArrayList<>();
同一本書說的(相對於上面的代碼是):
....the files contain array of Strings.
我對類型擦除規則和上面的ArrayList
示例非常困惑。 在這種情況下, files
數組如何知道它具有String
數組? (這與類型擦除規則相矛盾)
為了查看結果Pair
代碼(即如何進行類型擦除),如何在這里使用javap
工具?
我在這里想念什么嗎?
您的困惑來自編譯器的功能和JVM的功能。
Pair<String> pair = new Pair<>(); //I use Java 7 diamond syntax here.
String first = pair.getFirst();
在JVM中相當於
Pair pair = new Pair();
String first = (String) pair.getFirst();
對於Map.get()
Map<Key, Value> map = ...
Value value = map.get(key);
在JVM中
Map map = ...
Value value = (Value) map.get(key);
難道我的代碼需要再次以getFirst的返回類型從Object轉換為String嗎?
沒有轉換發生。 該對象未更改。 所發生的一切可能是對引用進行強制檢查。
為了查看Pair的結果代碼(即如何進行類型擦除),如何在此處使用javap工具?
使用javap -c -classpath . ClassUsingPair
javap -c -classpath . ClassUsingPair
1. Erasure
是一個過程,在該過程中,編譯器從類和方法,變量等中刪除編譯期間的Type parameter
和Type arguments
。
2. Box變成Box,這稱為raw-type , Raw-type是其中通用類或接口名稱不帶type參數的一種。
3.因此,在運行時不會找到泛型... 這主要是為了使沒有使用泛型的代碼毫無問題地運行 ,主要是那些在泛型出現之前編寫的代碼。
4.通用類不會被實例化,因為它需要啟動其構造函數,而不會發生,因為在運行時原始Type參數不會存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.