2017-06-01 53 views
1

在Java 1.8中工作時,需要在HashMap中確定K和V的類。 我的第一次嘗試沒有奏效,我承認我不知道該從哪裏出發。我希望能養活這個如何確定容器模板類

public static int foo(Object obj){ 
    int result = 0; 
    String x = obj.getClass().getSimpleName(); 

    switch(x){ 
     case "HashMap": 
      Type sooper = obj.getClass().getGenericSuperclass(); 
      Type key = ((ParameterizedType)sooper).getActualTypeArguments()[ 0 ]; 
      Type value = ((ParameterizedType)sooper).getActualTypeArguments()[ 1 ]; 
      System.out.println(sooper.getTypeName()); 
      System.out.println(key.getTypeName()); 
      System.out.println(value.getTypeName()); 

      break; 
     } 
} 

public static void main(String[] args) { 
    foo(new HashMap<Integer,Character>()); 
} 

輸出:

Class :: HashMap 
java.util.AbstractMap<K, V> 
K 
V 
+0

你看看:https://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime? –

+0

感謝您的鏈接。除非我誤解了,否則當你知道已聲明的類時,這會起作用。我不能做像GenericClass(新的HashMap )。這會告訴我這是一個HashMap,我回到了原來的問題。 – BAMF4bacon

+0

另一個選擇是從地圖中獲取一些元素並在這些元素上調用'getClass',但不能保證那些元素具有'K'和'V'(可能是子類型)的確切類型。否則,這是不可能的。 –

回答

0

通常,您將無法取回K型和V由於類型擦除。您所創建的模板對象後,系統不會把它看成 <unique_type K, unique_type V> 而是 <Object K, Object V>

我做了一些尋找和發現another question在這裏,這樣提供了一個醜陋的,但工作解決問題的辦法。

+0

我已經嘗試了幾種解決方案,而且都沒有工作。我要與「不可能」感謝大家。 – BAMF4bacon

0

我解決了這個問題,我自己通過使用枚舉類型並將其作爲參數傳遞給我的函數,因爲函數調用者在這種情況下知道類。