2014-10-14 6 views
3

Я немного озадачен в (7) поведении в Java при этом:Кастинг Generic коллекции в качестве параметра функции

Say У меня есть CTOR для Foo, который принимает Map<String,String> в качестве параметра. Следующий код:

new Foo(ImmutableMap.of()); 

Выдает ошибки Ошибка:

java: no suitable constructor found for Foo(com.google.common.collect.ImmutableMap) constructor Foo(java.util.Map) is not applicable

Попытка бросить в Map<String, String> явно не работает, а также компилятор жалуется, что типы не являются конвертируемыми. Однако это работает очень хорошо:

Map<String, String> map = ImmutableMap.of(); 
new Foo(map); 

Что, черт возьми, происходит здесь? Почему компилятор обрабатывает локальную переменную иначе, чем параметр функции?

ответ

6

компилятор Java, кажется, не быть в состоянии вывести общие типы из конструктора подписи и возвращается к стертому типу

использование (эквивалент Map<Object, Object>.):

new Foo(ImmutableMap.<String, String> of()); 
+0

Отличный ответ. Мне стало понятно, что конструктор, который может быть вызван, может быть неоднозначным (что, если есть второй ctor, который принимает карту , тогда действительно не может вывести, какой ctor вызвать) – eladidan

4

ImmutableMap.of() в сигнатуре метода возвращает пустой Map<Object,Object>, который передается, и для этого типа конструктор не определен.

Но когда вы используете Map<String, String> map = ImmutableMap.of();, он возвращает конкретно Map<String ,String> в чистом безопасном типе.

Вы должны использовать его как этот new Foo(ImmutableMap<String ,String>.of());

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