我目前有这样的方法:
public static Report createReport(Map<String,Object> parameters) {...}
我试图找出是否有一种方法可以更改通用规范,以便它接受Map<String,Object>
和Map<String,String>
的{{1}}和parameters
。< / p>
请注意,createReport
需要能够向parameters
添加条目。这可能吗?
答案 0 :(得分:2)
请参阅:
特别是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
)接口。