簡體   English   中英

Java中的類型擦除

[英]Type erasure in Java

我必須處理嵌套的集合(例如,列表列表或地圖列表),這就是我要處理的方式:

  public static String doSomething(Map<?, ? extends Collection<?>> map) {
     ...
  }

  public static String doSomething(Map<?, ? extends Map<?, ?>> map) {
     ...
  }

但是編譯器告訴我,以上兩種方法具有相同的類型擦除。 我不知道為什么,因為我指定了不同的類型界限。

刪除Map<?, ? extends Collection<?>> Map<?, ? extends Collection<?>>Map<Object, Object>

刪除Map<?, ? extends Map<?, ?>> Map<?, ? extends Map<?, ?>>也是Map<Object, Object>

要了解原因,您需要了解如何計算Map的刪除量。 基本上,您采用類型( Map<K, V> )並將形式類型參數(而不是實際類型參數)替換為其各自的最小上限類型。 在這種情況下,最小的上限類型是KV Object ,因為在Map接口中它們都沒有任何類型約束。

我想我可能已經編造了“最小上限類型”一詞。 (對不起)但是我的意思是最具體的類型,它不是集合中允許的任何可能類型的子類型。


考慮擦除的另一種方法如下。 考慮此類:

public class Test <T> {
    public set(T t):
}

現在想象一下,我們必須不使用泛型來表達這一點。 我們將使用什么實際類型代替T 在這種情況下,它將是Object

而事實上,當一個泛型類型映射到運行時類型,這正是發生了什么!


但是,基本上,您將無法創建僅在Map類型的類型參數化方面不同的方法重載。 除非您更改類型:

  public class X implements Map<String, Integer> ...

  public class Y implements Map<String, Double> ...

  public static String doSomething(X map) {
     ...
  }

  public static String doSomething(Y map) {
     ...
  }

....至少可以說很難看。

解決方案:使用不同的方法名稱,而不要嘗試重載相同的名稱。

無法重載每個重載的形式參數類型都擦除為相同原始類型的方法。

在您的代碼中,兩個方法在類型擦除后具有相同的簽名:

public static String doSomething(Map map);

要解決您的問題,您可以僅使用兩個不同的方法名稱,而不必重載該方法。

暫無
暫無

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

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