2012-11-01 2 views
2

Я использую generics в 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

Смежные вопросы