idea警告:Unchecked cast: ‘java.lang.Object’ to ‘java.util.List

  • Post author:
  • Post category:java


1. 出现原因,实际应用时map集合中存在多个键值对,而由于每个键对应的值为不同类型,当存在一个值的类型为List时,在接收时做强制转换会出现此警告

2. 出错代码举例:

            Map<String,Object> repeatMap = checkAndRemoveRepeatRecords(dataList);
       
            int dataRepeatCounter = (int)repeatMap.get("dataRepeatCounter");
            List<String[]> dataList = (List<String[]>)repeatMap.get("dataList");

3. 图示:



3. 修改方法1(加unchecked注解):

public class Test {
    public static void main(String[] args) {
        test1();
    }

    @SuppressWarnings("unchecked")
    private static void test1() {
        Map<String, Object> map_original_foo = new HashMap<>();
        Map<String, Integer> map_original_son = new HashMap<>();
        map_original_son.put("a", 1);
        map_original_son.put("b", 2);
        map_original_son.put("c", 3);

        map_original_foo.put("aa", map_original_son);

        Map<String, Integer> map_current_son = (Map<String, Integer>) map_original_foo.get("aa");
        System.out.println(map_current_son);
    }
}

4. 修改方法2(类型检查):

public class Test {
    public static void main(String[] args) {
        testMap();
        testList();
    }

    private static void testMap() {
        Map<String, Object> map_original_foo = new HashMap<>();
        Map<String, Integer> map_original_son = new HashMap<>();
        map_original_son.put("a", 1);
        map_original_son.put("b", 2);
        map_original_son.put("c", 3);

        map_original_foo.put("aa", map_original_son);

        if (map_original_foo.get("aa") instanceof Map<?, ?>) {
            Map<?, ?> map_current_foo = (Map<?, ?>) map_original_foo.get("aa");
            Class keyClass = map_current_foo.entrySet().stream().findFirst().map(entry -> entry.getKey().getClass()).orElse(null);
            Class valueClass = map_current_foo.entrySet().stream().findFirst().map(entry -> entry.getValue().getClass()).orElse(null);

            if (String.class.equals(keyClass) && Integer.class.equals(valueClass)) {
                Map<String, Integer> map_current_son = new HashMap<>();
                for (Map.Entry entry : map_current_foo.entrySet()) {
                    String key = (String) entry.getKey();
                    Integer value = (Integer) entry.getValue();
                    map_current_son.put(key, value);
                }
                System.out.println(map_current_son);
            }
        }
    }

    private static void testList() {
        Map<String, Object> map_original_foo = new HashMap<>();
        List<String> list_original_son = new ArrayList<>();
        list_original_son.add("aa");
        list_original_son.add("bb");
        list_original_son.add("cc");
        map_original_foo.put("dd", list_original_son);

        if (map_original_foo.get("dd") instanceof List<?>) {
            List<?> temp_list = (List<?>) map_original_foo.get("dd");
            Class valueClass = temp_list.stream().findFirst().map(Object::getClass).orElse(null);
            if (String.class.equals(valueClass)) {
                List<String> list_current_son = new ArrayList<>();
                for (Object s: temp_list) {
                    String value = (String) s;
                    list_current_son.add(value);
                }
                System.out.println(list_current_son);
            }
        }
    }
}

5. 参考:


http://www.xinotes.net/notes/note/1412/


https://stackoverflow.com/questions/12566757/intellij-warning-generic-unchecked-assignment


http://blog.csdn.net/qq_27093465/article/details/51910411