2017-06-01 1 views
1

In Java 1.8 muss ich die Klasse von K und V in HashMap ermitteln. Mein erster Versuch hat nicht funktioniert, und ich gebe zu, ich habe keine Ahnung, wohin ich von hier aus gehen soll. Ich hoffe, dieseSo ermitteln Sie Containervorlagenklassen

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>()); 
} 

Ausgang zu füttern:

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

Haben Sie sich angeschaut: https://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime? –

+0

Danke für den Link. Wenn ich mich nicht irre, funktioniert das, wenn Sie die deklarierte Klasse kennen. Ich kann etwas wie GenericClass nicht machen (neue HashMap ). Das würde mir sagen, dass es eine HashMap ist, und ich bin zurück zum ursprünglichen Problem. – BAMF4bacon

+0

Eine andere Möglichkeit besteht darin, einige Elemente aus der Map zu holen und 'getClass' für diese aufzurufen, aber es gibt keine Garantie, dass diese genau die Typen 'K' und' V' (könnte ein Subtyp sein) haben. Sonst ist es nicht möglich. –

Antwort

0

der Regel werden Sie nicht in der Lage sein, die Arten von K und V abzurufen aufgrund Typ Löschung. Nachdem Sie das Vorlagenobjekt erstellt haben, zeigt das System es nicht als <unique_type K, unique_type V> sondern <Object K, Object V>

Ich habe auf einige der Suche und fand another question hier so dass bietet eine hässliche, aber das Problem Arbeitslösung.

+0

Ich habe dort mehrere Lösungen ausprobiert, und keiner von ihnen hat funktioniert. Ich gehe mit "Impossible" Danke an alle. – BAMF4bacon

0

Ich löste das selbst, indem ich einen Enum-Typ benutzte und dies als Argument an meine Funktion weitergab, weil der Funktionsaufrufer die Klasse in diesem Fall kannte.

Verwandte Themen