簡體   English   中英

如何在參數中正確使用泛型

[英]How to use generics in parameter properly

我現在有這個:

  public <T> void run(T x){

    if(x instanceof HashMap){
      ((HashMap<String,String>)x).put("foo","bar");
    }

  }

但我看到以下警告:

在此處輸入圖片說明

我有三個問題:

  1. 有人知道該警告是關於什么的嗎?
  2. 我在使用instanceof運算符對嗎? 是否有更好/更准確的檢查方法?
  3. 是否有某種使用泛型的方法,以便該方法“知道”類型是什么,因此我不必強制轉換類型?

T可以是擴展Object的任何類型,並且您的代碼不是類型安全的。 如果傳入了HashMap<String, String>任何內容HashMap<String, String>則可能會收到ClassCastException 但是使用operator的instance of將防止這種情況的發生。 但是仍然任何人都可以將任何對象發送到您的方法。 因此,未經檢查的警告僅說明了這一點。

在這里使用實例的實例對我來說有點尷尬。 相反,如果您想向現有地圖添加條目,則可以像這樣更改通用方法的聲明,

public <S, T extends Map<S, S>> void addEntryToMap(T x, S key, S value) {
    x.put(key, value);
}

與上面的check方法實例相比,此代碼是類型安全的,更干凈更優雅的代碼。

我不確定您要用什么方法實現

public <T> void run(T x){ // Gets an unbounded T which means it can accept anything under Object.

    if(x instanceof HashMap){
      ((HashMap<String,String>)x).put("foo","bar"); // How are you so sure it is an HashMap<String,String>? It can be any HashMap,or even Object!! That is exactly why your compiler is telling it is doing an unchecked cast.
    }
  }

這回答了您的第一點。

第二點,我們需要對此進行更清晰的解釋。

第三點,Java中有一種稱為類型擦除的類型,其中通用方法將無法在運行時知道對象的類型。 您可以傳遞類進行轉換,也可以使用有界通配符進行編譯時檢查。

暫無
暫無

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

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