如何使用Java泛型解决此案例?

时间:2015-09-19 07:20:01

标签: java generics

我有一个存储在Map中的键值对:Map<String, Object>。这些值从文件中获取并属于不同的基元,因此在Map中存储为Object类型。

假设Map包含三个键值对:

{
    "objA": 1,
    "objB": "MyName",
    "obj3": "19-09-2015"
}

必须将ObjA检索为Integer,必须将objB检索为String,并且必须将obj3检索为LocalDate。

我希望有一个方法可以将Map,KeyName和Desired Class作为参数传递,它应该使用Desired Class作为类型返回获取的值:

这样的事情:

public T fetch(Map<String, Object> myMap, String key, Class T) {
    // Find value corresponding to 'key' 
    Object object = myMap.get(key);

    // Return the object as type T
    return (T)object; 
}

然后我将此方法称为:

Double myJavaValue = fetch(myMap, myValue, java.lang.double.class);

我究竟能做到这一点?

6 个答案:

答案 0 :(得分:4)

@SuppressWarnings("unchecked")
public static <T> T fetch(Map<String, Object> myMap, String key) {
    return (T) myMap.get(key);
}

答案 1 :(得分:3)

完整的方法是:

public <T> T fetch(Map<String, Object> myMap, String key, Class<T> clazz) {
    // Find value corresponding to 'key' 
    Object object = myMap.get(key);
    return clazz.cast(object); 
}

答案 2 :(得分:1)

public static <T>  T func(MapM<String, T> myMap, String key, Class<T> cls) {
    return cls.cast(myMap.get(key));
}

答案 3 :(得分:1)

private void start() {
    Map<String, Object> dataMap = new HashMap<String, Object>();
    dataMap.put("objA", 1);
    dataMap.put("objB", "MyName");
    dataMap.put("objC", LocalDate.of(2015, 9, 19));

    this.fetch(dataMap, "objA", Integer.class);
    this.fetch(dataMap, "objB", String.class);
    this.fetch(dataMap, "objC", LocalDate.class);
}

private <T> T fetch(Map<String, Object> myMap, String key, Class<T> dataType) {
    return dataType.cast(myMap.get(key));
}

答案 4 :(得分:0)

您可以使用强制转换方法。

return T.cast(myValue);

答案 5 :(得分:-1)

实际上,您的代码似乎几乎是正确的!你只是不知道泛型方法的语法。只需在<T>后添加public,然后删除Class参数:

public <T> T fetch(Map<String, Object> myMap, String key) {
    // Find value corresponding to 'key' 
    T object = (T)myMap.get(key);

    // Return the object
    return object; 
}