通用签名接受Map <string,object>或Map <string,string> </string,string> </string,object>

时间:2014-11-25 16:42:20

标签: java generics

我目前有这样的方法:

public static Report createReport(Map<String,Object> parameters) {...}

我试图找出是否有一种方法可以更改通用规范,以便它接受Map<String,Object>Map<String,String>的{​​{1}}和parameters。< / p>

请注意,createReport需要能够向parameters添加条目。这可能吗?

3 个答案:

答案 0 :(得分:2)

请参阅:

  

Difference between <? super T> and <? extends T> in Java

特别是this answer PECS (生产者扩展,消费者超级)规则是巧妙的。 尝试:

public static Report createReport(Map<String,? super String> parameters) {...}

您可以添加String并阅读Object s:

parameters.put("a,", "b");
Object object = parameters.get("c");

答案 1 :(得分:0)

如果您只是从地图中读取值,则可以执行以下操作:

public static Report createReport(Map<String,?> parameters) {...}

但是,由于您还想添加enteries,您需要知道类型,或者至少能够知道Map中的类型与您添加的类型相同。

如果它是可变的,那么我建议使用另一个参数来转换为你需要的类型。

interface Converter<T>{

    T convert(Object o);
}

然后将此参数添加到createReport方法中,如下所示:

public static <T> Report createReport(Map<String,T> parameters, Converter<T> converter) {...}

然后在你的方法中你可以做这样的事情:

   T value = converter.convert(foo);

   parameters.put(key, value);

然后由createReport的调用者提供正确的转换器。

答案 2 :(得分:0)

不,不可能。 Java中没有类型联合。您必须恢复到最低的公共超类,在您的情况下Object。在某些情况下,您可以使用Interface,例如集合类型或-able样式(Closeable)接口。

相关问题