Параметры ограниченного типа Java в HashMap

Я только учусь использовать подстановочные знаки и параметры ограниченного типа. Я хочу использовать (я думаю) ограниченные подстановочные знаки в методе, которому передается HashMap. Я видел примеры параметров ограниченного типа и ограниченных подстановочных знаков, но не нашел ничего, что показывало бы мне, как передать HashMap в метод, где 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) Или есть лучший способ сделать это? Другими словами, я делаю это неправильно?

Спасибо за ваш совет.


person Patricia    schedule 04.10.2015    source источник
comment
Какая связь между Company, Employee и Location? Есть ли у них общий супертип, кроме Object?   -  person Andy Turner    schedule 04.10.2015
comment
Чтобы ограничить (представить связь) между типами параметров или между параметром и типом возвращаемого значения, вы должны использовать переменную типа. Подстановочные знаки не позволяют создавать такие отношения, они просто ограничивают конкретный параметр или тип возвращаемого значения.   -  person RealSkeptic    schedule 04.10.2015
comment
@AndyTurner — единственный распространенный супертип — Object. Я просто пытаюсь придумать умный (не новичок) способ использовать тот же метод синтаксического анализатора XML для анализа значений для любого из значений моего объекта карты.   -  person Patricia    schedule 04.10.2015


Ответы (1)


Поскольку ваш метод readXML(Map<Integer, ?(V)> companies) может принимать V типа Company, Employee и Location. Вы можете решить это указанными ниже способами.

  1. Вы можете сделать все упомянутые классы для расширения нового класса или можете реализовать наш пользовательский интерфейс Type и использовать этот тип для 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 является непроверенным исключением. Убедитесь, что вы правильно задокументировали свой метод, если решите создать исключение.

person rajuGT    schedule 04.10.2015
comment
Class clazz будет генерировать предупреждение необработанного типа при компиляции. Правильная подпись должна быть public <V> Map<Integer, V> readXML(Map<Integer, V> values, Class<V> clazz). - person VGR; 06.10.2015