簡體   English   中英

與Java泛型中的類型擦除規則混淆

[英]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 parameterType arguments

2. Box變成Box,這稱為raw-typeRaw-type是其中通用類或接口名稱不帶type參數的一種。

3.因此,在運行時不會找到泛型... 這主要是為了使沒有使用泛型的代碼毫無問題地運行 ,主要是那些在泛型出現之前編寫的代碼。

4.通用類不會被實例化,因為它需要啟動其構造函數,而不會發生,因為在運行時原始Type參數不會存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM