Изменить карту карты на общий тип - PullRequest
0 голосов
/ 19 марта 2019

У меня есть метод, который принимает карту с ключом в качестве строки и значением в качестве объекта типа T, который является сериализуемым объектом.

public <T extends Serializable> void set(String key, Map<String, T> fields) {
  ......
  .......
}

Когда я пытаюсь передать карту карты,это дает ошибку для неправильного типа аргумента.Я хочу, чтобы этот метод взял общий объект и не хочу менять его на set(String key, Map<String, Map<String, String>> fields)

Map<String, String> fieldmapL1 = new HashMap<>();
fieldmapL1.put("ABC", "XYZ");
Map<String, Map<String, String>> fieldmapL2 = new HashMap<>();
fieldmapL2.put("Key", fieldmapL1);

instance.set("key", fieldmapL2);

enter image description here

Ответы [ 2 ]

3 голосов
/ 19 марта 2019

Вам необходимо указать тип, который вы используете:

instance.<Map<String, String>>set("key", fieldmapL2);

Тогда тип T разрешается до String. Также это будет работать, только если экземпляр instance создан правильно (вы можете установить T на String при создании экземпляра, тогда вам не нужна указанная выше строка или вы можете опустить явные типы и использовать мое решение).

2 голосов
/ 19 марта 2019

Вы указываете, что введенный вами текст не соответствует вашим требованиям. Как объясняет @Pankaj в других комментариях к этой теме, карта не сериализуема, поэтому ваше определение fieldmap2 не соответствует критериям для T. Обновление экземпляров карт для правильного использования HashMap, который реализует сериализуемый, делает свое дело (иначе больше нет предупреждений в intelliJ )

public static class Test{
        public <T extends Serializable> void set(String key, Map<String, T> fields) {

        }
    }


    public static void main(String[] args) {
        HashMap<String, String> fieldMapL1 = new HashMap<>();
        fieldMapL1.put("ABC", "XYZ");
        Map<String, HashMap<String, String>> fieldmap2 = new HashMap<>();
        fieldmap2.put("key", fieldMapL1);

        Test test = new Test();
        test.set("key", fieldmap2);
    }
...