Обработка универсальных элементов LinkedHashMap <String, LinkedHashMap> - PullRequest
0 голосов
/ 05 мая 2018

Я никогда не был так хорош в Generics, но я использовал SnakeYaml. Есть ли способ разрешить мне исправить этот код

public class MyService{
private static Map<String, LinkedHashMap> myYamlMap;

public static void filter(Map<String, String>){
    //myYaml map reads the YAML File using SnakeYaml
    //Snake Yaml returns data in this format <String,LinkedHashMap>
    Yaml yaml = new Yaml(); 
    Object object = yaml.load(reader); 
    Map<String, LinkedHashMap> myYamlMap = (Map<String, LinkedHashMap>)object; 

    LinkedHashMap<String, LinkedHashMap> mainMap = (LinkedHashMap<String, LinkedHashMap>)myYamlMap.get("sample");
}

} и сойдет с рук это предупреждение времени компиляции?

Multiple markers at this line
    - Line breakpoint:MyService [line: 69] - filter(Map<String, String>)
    - Type safety: Unchecked cast from LinkedHashMap to LinkedHashMap<String,LinkedHashMap>
    - LinkedHashMap is a raw type. References to generic type LinkedHashMap<K,V> should be 
     parameterized
    - LinkedHashMap is a raw type. References to generic type LinkedHashMap<K,V> should be 
     parameterized

Snakeyaml .. использует LinkedHashMap в своей конструкции, и я хотел уйти с кастинга.

1 Ответ

0 голосов
/ 05 мая 2018

Учитывая ваш код:

private static Map<String, LinkedHashMap> myYamlMap;
LinkedHashMap<String, LinkedHashMap> mainMap = (LinkedHashMap<String, LinkedHashMap>)myYamlMap.get("sample");

Это не имеет смысла.

private static Map<String, LinkedHashMap> myYamlMap;

Вероятно, это должно быть

private static Map<String, Map<Key, Value>;
myYamlMap = new LinkedHashMap<String, Map<Key, Value>>;
myYamlMap.put("key1", new LinkedHashMap<Key,Value>();

для некоторых типов Key и Value, которые не указаны в вашем коде ... ИЛИ что-то более сложное - см. Ниже

LinkedHashMap<String, LinkedHashMap> mainMap = (LinkedHashMap<String, LinkedHashMap>)myYamlMap.get("sample");

Ваше использование get здесь подразумевает, что myYamlMap должно быть

private static Map<String, Map<String, Map<Key, Value>> myYamlMap;
myYamlMap = new LinkedHashMap<String, Map<String, Map<Key,Value>>>;
Map<Key,Value> temp = new LinkedHashMap<Key,Value>();
temp.put(k1, value1);
myYamlMap.put("sample", temp);

поскольку вы, похоже, ожидаете, что get() вернет Map<String,Map<Key,Value>> из внешней коллекции.

СЕЙЧАС вы можете сделать

Map<String, Map<Key,Value>> mainMap = myYamlMap.get("sample");

Причина использования интерфейса Map заключается в том, что нигде в вашем коде вы не используете методы, специфичные для LinkedHashMap, поэтому все объявления должны использовать только Map<...>, за исключением случаев создания экземпляров карт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...