2015-10-04 8 views
3

Я просто изучаю, как использовать подстановочные знаки и параметры ограниченного типа. Я хочу использовать (я думаю) ограниченные подстановочные знаки в методе, который передается HashMap. Я видел примеры параметров ограниченного типа и ограниченных подстановочных знаков, но я не нашел ничего, что покажет мне, как передать HashMap в метод, в котором HashMap может содержать разные объекты значений.Параметры ограниченного типа Java в HashMap

Map<Integer, Company> 
Map<Integer, Employee> 
Map<Integer, Location> 

Это то, что я в качестве примера для первой карты, перечисленные выше:

public Map<Integer, Company> readXML(Map<Integer, Company> companies) { 

Я хочу использовать что-то вроде следующего, чтобы включить этот метод, чтобы иметь дело с какой-либо одной из моих карт, перечисленных выше.

public Map<Integer, ?> readXML(Map<Integer, ?> values) { 

Может ли кто-нибудь показать мне пример того, как я могу использовать подстановочные знаки для значений карты в этом методе?

1) Нужно ли создавать класс карты, который расширяет объекты стоимости (компания, сотрудник, местоположение)?

2) Или есть лучший способ выполнить это? Другими словами, я делаю это неправильно?

Благодарим вас за советы.

+0

Какая связь между 'Company',' Employee' и 'Location'? Есть ли у них общий супертип, отличный от 'Object'? –

+0

Чтобы ограничить (представлять взаимосвязь) между типами параметров или между параметром и типом возвращаемого значения, вы должны использовать переменную типа. Подстановочные знаки не позволяют создавать такие отношения, они просто ограничивают конкретный параметр или тип возвращаемого значения. – RealSkeptic

+0

@ AndyTurner - единственный распространенный супертип - Object. Я просто пытаюсь придумать умный (не новичок) способ использовать один и тот же метод парсера XML для анализа значений для любого из значений моего объекта карты. – Patricia

ответ

2

С вашего метода readXML(Map<Integer, ?(V)> companies) может принимать V Тип Компания, работник и местонахождение. Вы можете решить это ниже.

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

  2. Добавить дополнительный параметр в ваш метод который посылает Введите информацию о нем, называя api.

    public <V> Map<Integer, V> readXML(Map<Integer, V> values, Class<V> clazz) { 
        if(clazz == Integer.class) { 
         ... 
        } else if// or if all the class type has same implementation use the 
          // || operator in the above if condition only. 
          ... 
        //and finally 
        else { 
         // either throw **IllegalArgument/Unsupported operation** exception 
         // for the type 'V' Or handle in any other way you like to implement 
        } 
    } 
    

    Наконец, IllegalArgument/UnsupportedOperation exception снят исключение. Убедитесь, что вы правильно документируете свой метод, если вы решите выбросить исключение.

+1

'Class clazz' генерирует предупреждение о сыром виде при компиляции. Правильная подпись должна быть 'public Карта readXML (Карта значения, класс clazz)'. – VGR