2017-06-01 31 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

我解决了这个问题,我自己通过使用枚举类型并将其作为参数传递给我的函数,因为函数调用者在这种情况下知道类。