2016-04-30 18 views
0

Ich möchte eine Methode haben, die den erforderlichen Typ von Objekten zurückgibt, die aus einer Map extrahiert wurden. Hier ist ein BeispielWie generische List-Klasse als Argument an die generische Methode in Java übergeben?

Map<String,Object> map = new HashMap<>(); 
map.put("ids", Arrays.asList(5,345,45645)); 
map.put("id", 325); 

<T> T get(String arg, Class<T> clazz) { 
    return (T) map.get(arg); 
} 

Dann kann beispielsweise Integer mit diesem Code erhalten werden

Integer id = get("id", Integer.class); 

Aber wenn ich versuche, eine Liste der Objekte auf diese Weise zu erhalten

List<Integer> ids = get("ids", new ArrayList<Integer>().getClass()); 
List<Integer> ids = get("id", List.class); 

IntelliJ IDEA warnt: Unchecked assignment: 'java.util.ArrayList' to 'java.util.List<java.lang.Integer>'

ich erwartete somethi ng wie List<Integer>.class (analog zu Integer.class, Boolean.class etc ...), was würde als

List<Integer> ids = get("ids", List<Integer>.class`) 

verwendet werden, aber dies kompiliert wird nicht.

Also gibt es eine Lösung?

Antwort

2

Sie benötigen den Parameter Class nicht.

<T> T unsafeGet(String arg) { 
    return (T) map.get(arg); 
} 

I umbenannt die Methode, weil Sie Wegwerfen alle Compiler Typ-Überprüfung sind.

Diese beiden Linien zusammenstellen, aber nicht zur Laufzeit:

Integer ids = unsafeGet("ids"); // java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Integer 
Element id = unsafeGet("id"); // java.lang.ClassCastException: java.lang.Integer cannot be cast to org.w3c.dom.Element 
Verwandte Themen