2013-09-13 3 views
0

У меня возникли проблемы со следующей ситуацией:проблемы с обобщенными методами

private static List<? extends Object> function1(final Collection<? extends Object>... collections) { 
    final List<Object> result = new ArrayList<Object>(); 
    // do some work 
    return result; 
} 


public static List<? extends Object> function2(final Collection<? extends Object>... collections) { 
    // do some work 
    return function1(collection); 
} 

На последней строке ошибка Type mismatch: cannot convert from Pair<String,List<capture#74-of ? extends Object>> to Pair<String,List<? extends Object>>

Как я могу определить дженерики правильно?

UPDATE: должна быть возможность использовать различные типы коллекций в вызове function1(Collection<Long>, Collection<String>)

+0

не могли бы вы рассказать, почему ' '? – sanbhat

ответ

1

Ваши заявления не означают, что параметр типа & возвратного типа «function2» одинаковы.

Если элемент типа в & отказа являются общими, вы можете объявить:

public static <T> List<T> function2 (Collection<T>... inputs) { 
    // do some work 
    return function1(inputs); 
} 

public static <T> List<T> function1 (Collection<T>... inputs) { 
    // do some work 
} 

типы подстановочных с очевидно похожими предками не обязательно назначаемые друг к другу, если их «захвата» не обязательно из одно и то же место. Это также защищает от более общих назначений, используемых для добавления элементов неправильного типа.

Например, List<String> не присваивается List<Object>, так как объекты, добавленные в список строк, будут разбивать код, ожидающий только строк в списке.

В целом, <?> является лучшим сокращением на <? extends Object>. Возможно, также были некоторые ошибки/ненужные предупреждения, написав их длинным способом. См.: http://bugs.sun.com/view_bug.do?bug_id=6480391

«коллекции» довольно плохо для вызова вашего параметра, а использование имен/нажатий клавиш без смысла - ошибка. «Входы» являются полностью родовыми, но, по крайней мере, он говорит вам, в каком направлении идет параметр. & четко отличает его от «результатов».

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