2013-09-20 5 views
0

код получает меня в заблуждение:Имеет ли класс B, который реализует интерфейс I, который расширяет интерфейс J, также расширяет тип I?

Collection<? extends Map<String, String>> a = 
         new ArrayList<SortedMap<String, String>>(); 
SortedMap<String, String> b = new TreeMap<String, String>(); 
b.put("1","a"); 

Ошибка:

a.add(b); 

Метод добавления (? Захвата # 2-оф расширяет карту) в тип коллекции> не применяется для аргументов (SortedMap) Почему? SortedMap расширяет Map и TreeMap - это класс, который реализует SortedMap.

ответ

3

Это означает, что

Collection<? extends Map<String, String>> a ; 

Элементы a являются неизвестный класс, который расширяет карту. Вы имеете в виду, когда вы получаете значение, это карта, но вы не можете сказать, какая карта будет действительной для добавления в коллекцию.

Например, a не знает класс, который расширяет Карту, поэтому он не может позволить любому подклассу, поскольку он не может знать, что является действительным.

List<HashMap<String, String>> listOfMap = new ArrayList<>(); 
Collection<? extends Map<String, String>> a = listOfMap; 
SortedMap<String, String> b = new TreeMap<String, String>(); 
b.put("1", "a"); 
a.add(b); // produces an error as it should. 

Если изменить a быть

Collection<SortedMap<String, String>> a = new ArrayList<SortedMap<String, String>>(); 

Это прекрасно, чтобы добавить b, как именно этот вид.

+0

Почему я не могу сказать? Каждый тип, который расширяет карту, будет действительным. – user710818

+1

@ user710818 Это не то, что '? расширяет' средства. Он * не означает, что любой подкласс действителен, это означает, что подкласс не известен. См. Мой пример. –

+0

понимать. Большое спасибо! – user710818

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