我正在为各种平台编写一个http客户端库。(Java SE,Java EE)
使用我的Java SE实现,我做
public void doSome(..., Map<String, List<Object>> params, ...);
通过我的Java EE实现,我做
public void doSome(..., MultivaluedMap<String, Object> params, ...);
如果我想为这些方法定义通用抽象类,我该如何为Map<String, List<Object>>
和MultivaluedMap<String, Object>
定义方法?如果没有简单的T
,有没有优雅的方法呢?
请注意,Multivalued<K, V>
扩展了Map<K, List<V>>
。
我目前只能这样做。
public abstract class AbstractClient {
public void doSome(..., Map<String, List<Object>> params, ...);
}
public class JavaEEClient extends AbstractClient {
static <K, V> MultivaluedMap<K, V> multivalued(Map<K, List<V>> map) {
if (map == null) {
return null;
}
if (map instanceof MultivaluedMap) {
return (MultivaluedMap<K, V>) map;
}
final MultivaluedMap<K, V> multi = new MultivaluedHashMap<>(map.size());
multi.putAll(map);
return multi;
}
public void doSome(..., MultivaluedMap<String, Object> params, ...) {
}
@Override
public void doSome(..., Map<String, List<Object>> params, ...) {
doSome(..., multivalued(params), ...);
}
}
更新
我真的不得不承认我自己错过了领导。我实际上只使用JAX-RS方法开始,并开始使用URLConnection
为Java SE添加方法。
是O.K.直接MultivaluedMap
,因为WebTarget
和Invocation
接受MultivaluedMap
。
当我开始为URLConnection
添加类和方法时,出现了问题。
我想我必须坚持Map<String, List<Object>>
并使用我的mutivalued
效用方法。
答案 0 :(得分:2)
如果您说MultivaluedMap<K, V>
延伸Map<K, List<V>>
,那么您可以这样做:
public abstract class AbstractClass {
public void doSome(..., Map<String, List<Object>> params, ...)
...
}
它将同时接受MultivaluedMap和Map。