如何为Map <string,list <object =“”>&gt;定义通用方法?和MultivaluedMap <string,object =“”>?

时间:2016-08-13 11:21:23

标签: java generics collections

我正在为各种平台编写一个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,因为WebTargetInvocation接受MultivaluedMap

当我开始为URLConnection添加类和方法时,出现了问题。

我想我必须坚持Map<String, List<Object>>并使用我的mutivalued效用方法。

1 个答案:

答案 0 :(得分:2)

如果您说MultivaluedMap<K, V>延伸Map<K, List<V>>,那么您可以这样做:

public abstract class AbstractClass {

    public void doSome(..., Map<String, List<Object>> params, ...)
    ...
}

它将同时接受MultivaluedMap和Map。