2012-11-01 34 views
2

我在Java中使用泛型與幾個類。我想找到一種方法來減少我需要添加的參數數量。減少Java中的泛型參數

public abstract class KeyValueProducer<O,K,V> { 
    .... 
} 

public class KeyValueProducerMapper<O,K,V,KVP extends KeyValueProducer<O,K,V>> { 

    public static <O,K,V,KVP extends KeyValueProducer<O,K,V>> KeyValueProducerMapper<O,K,V,KVP> create(Set<KVP> set) { 
     return new KeyValueProducerMapper(set); 
    } 

    public KeyValueProducerMapper(Set<KVP> kvps) { 
     ... 
    } 

    public V getVal(K key) { 
     return map.get(key).getValue();  
    } 
} 

當我想讓我的KeyValueProducerMapper的一個實例,它看起來像我需要寫出來:

Set<KVP> set; 
.... 
KeyValueProducerMapper<K,V,O,KVP> kvpm = new KeyValueProducerMapper(set); 

這似乎有點漫長而可笑。有什麼辦法可以像這樣定義它嗎?

KeyValueProducerMapper<KVP> kvpm = new KeyValueProducerMapper(set); 
+1

答案是否定的,如果您覺得事情不對,您可能需要重新審視您的設計。 – DaveRlz

+1

就個人而言,我會避免使用'KVP'(可能會使用'P')作爲通用替代品之一。主要是因爲你已經使用'K'和'V'作爲另外兩個替代品(是的,我知道它們是不同的,而且它有點相關 - 但我只是覺得那個三個字母的人在做'別的東西「)。 –

回答

1

從你的例子中不清楚什麼類型的參數K,V和O用於。但是對於KeyValueProducerMapper類的聲明,您不能將其聲明爲KeyValueProducerMapper<KVP> = ...。您必須將其聲明爲KeyValueProducerMapper<O,K,V,KVP> = ...(使用O,K,V,KVP的具體類型或在父範圍中指定類型參數,即方法或類)。唯一的替代方法是將類聲明更改爲不具有類型參數K,V和O.

至於表達式的右邊部分,您可以使用靜態方法create()而不指定類型參數,因爲將會從表達式的左邊部分解決。

+0

如果我將其定義爲KeyValueProducerMapper ,我可以在其中返回返回類型O,K和V的方法嗎? 我會永遠繼承KeyValueProducer的顯式類型K,V和O(如果有幫助的話)。 – Joe

+0

如果它們是特定類型,那麼您將在這些方法上具有特定類型,並且不需要聲明類型參數。就像我說的,這些例子並不能爲您的問題提供完整的背景。 –

+0

是的,但是你可以在基類中有方法,並返回類型V. – Joe