2013-06-19 7 views
0
public class People { 
    class Family extends People { 
    } 
} 

public class Together { 
    private static ConcurrentMap<String, Collection<Family>> familyMap= new ConcurrentHashMap<String, Collection<Family>>(); 
    private static ConcurrentMap<String, ConcurrentMap<String, Collection<People>>> registry2 = new ConcurrentHashMap<String, ConcurrentMap<String, Collection<People>>>(); 

    static { 
     registry2.put(Family.class.toString(), familyMap); 
    } 
} 

(я уже попытался изменить декларацию registry2 к тому ? extends PeopleВставить хэш-карту в хэш-карту?

Ошибка: The method put(String, ConcurrentMap<String,Collection<People>>) in the type Map<String,ConcurrentMap<String,Collection<People>>> is not applicable for the arguments (String, ConcurrentMap<String,Collection<Family>>)

Как я могу поместить familyMap в registry2 HashMap

+4

'Коллекция ' не '' Коллекция : HTTP://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-p – assylias

+0

Я пробовал, что это тоже не нравится. Я понимаю, что гериархия полиморфизма не то же самое с дженериками. Есть ли другой способ помещать familyMap в реестр2? –

+2

Пожалуйста, прочитайте ответы на свои вопросы [здесь] (http://stackoverflow.com/q/17196851/1237040) и [здесь] (http://stackoverflow.com/q/17200675/1237040). Почему вы повторяете одни и те же ошибки снова и снова? «Java Generics НЕ ковариантны!» –

ответ

3

Это не карта проблема: это скорее проблема Generics. Вы считаете, что Collection<Family> является подклассом Collection<People>, потому что Family extends People, но это не тот случай.

Они на самом деле совершенно разные типы, поэтому компилятор жалуется, что вы не передаете аргументы нужного типа.


Вы можете решить эту проблему, установив карту семейства Map Map, содержащую коллекцию объектов People. Ваш код просто будет помещать в него объекты Family, и это нормально, потому что Семья - это люди.

Но когда вы возвращаете объекты семьи из карты, вам нужно приказать их семье, если вам нужно использовать определенные семейные функции, хотя есть риск, что по дороге люди (а не семья)) объект может проникнуть в него. Возможно, вы захотите рассмотреть другую конструктивную парадигму для смягчения этого риска.

+0

Итак, если они не распространяются так же, как расширяются классы, разве нет способа сделать это? –

+0

@StephenD Вы можете 1) заменить 'Collection >' и 'Collection >' с 'Family []' и 'People []' потому что 'Family []' extends 'People []' или 2) заменить 'ConcurrentMap < String, Collection > familyMap' с 'ConcurrentMap > familyMap'. – lifus

+2

Существует, если вы можете где-то изменить некоторые типы. Например, вы можете использовать 'ConcurrentMap > '. –

0

Вы пытаетесь поставить несовместимый тип, потому familyMap является Collection<Family> и не Collection<People>, который вы укажете в registry2 (ConcurrentMap<String, Collection<People>>)

+0

Ну, я могу поместить хэш-карту в хэш-карту? –

+0

Да, просто измените его на «Семья» или «Люди», в зависимости от того, что вы намеревались. – Dororo

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