2016-08-13 42 views
0

我写了各种平台的HTTP客户端库的工作。(Java SE的,Java EE的)如何为Map <String,List <Object>>和MultivaluedMap <String,Object>定义一个通用方法?

随着我的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), ...); 
    } 
} 

UPDATE

我真的不得不承认,我想念领导自己。实际上,我开始只使用JAX-RS方法,并开始为URLConnection添加Java SE的方法。

这是O.K.直接MultivaluedMap,因为WebTarget s和Invocation s接受MultivaluedMap

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

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

+1

但为什么你想要这个?只使用map就足够了,可以传递任何扩展它的东西,为什么你想要另一种接受多值图的方法呢? –

+0

Java 8?或之前? –

+1

如果你有一个多值映射,你会使用这个类的具体方法吗? – fge

回答

2

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

public abstract class AbstractClass { 

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

它可以同时接纳MultivaluedMap和地图。

+0

我知道它的确如此。但我想知道如何覆盖(实现)它。看我的编辑。 –

+0

嗯..这实际上是我错过了......我想......我真的不需要定义一个额外的方法。 –

+1

是的,你不需要。除非你想使用'MultivaluedMap'中的某些特定方法。 –

相关问题