15.13 泛型动态类型安全

在有的时候,泛型不能起到安全保护的作用,比如:

    private static void add(List list){
        list.add(123);
    }

    public static void main(String[] args) {
        List<String> l = new ArrayList<>();
        add(l);
        System.out.println(l);
    }

[123]


虽然设定了泛型,但是在执行的时候,由于擦除的作用,再list 内部,其实并不知道这里必须是一个String,擦除到object,所以123也可以放进去,这样就造成了不安全的因素

解决办法:

    private static void add(List list){
        list.add(123);
    }

    public static void main(String[] args) {
        List<String> l = Collections.checkedList(new ArrayList<>(),String.class);
        add(l);
        System.out.println(l);
    }
Exception in thread "main" java.lang.ClassCastException: Attempt to insert class java.lang.Integer element into collection with element type class java.lang.String
	at java.util.Collections$CheckedCollection.typeCheck(Collections.java:3037)
	at java.util.Collections$CheckedCollection.add(Collections.java:3080)
	at com.yaoqiang.demo.Demo.add(Demo.java:19)
	at com.yaoqiang.demo.Demo.main(Demo.java:24)

这样在放入不同类型的时候,直接提示异常


猜你喜欢

转载自blog.csdn.net/perfect_red/article/details/80962768
今日推荐