2016-08-13 41 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'中的某些特定方法。 –

相關問題