java ,不要太相信范型,范型失效的两种情况

版权声明:本文为博主原创文章,请尊重劳动成果,转载注明一下出处。 https://blog.csdn.net/zq1994520/article/details/82828650

 范型在java编程中有许多好处,也是我们平常经常使用的一种减少运行时错误的方式;但是在复杂的应用中,尤其是一个底层的模块中,我们不要太相信范型给我门反回的值。

首先:

     Java中范型是编译时检查类型,实际在字节码文件中没有对范型的描述,如果中间有没有范型的引用做桥梁或者运行时添加数据(通过java反射),那么范型将会失去效用。下面的代码在debug时查看会发现integers里面存储的数据时String类型,这个就是一个天坑。能够运行且不会运行出错。

public void test()
    {
        List<String> strings = new ArrayList<String>();
        strings.add("sdfsd");
        List objects = strings;
        List<Integer> integers = (List<Integer>) objects;
        System.out.println(integers);
    }

运行结果是

[sdfsd]

下面代码是一个通过运行时添加数据:

public void test()
    {

        List<Integer> strings = new ArrayList<Integer>();
        strings.add(12);
        Class clazz = null;
        try {
            clazz = Class.forName("java.util.ArrayList");
            Method addMethod = clazz.getMethod("add", Object.class); //必须时Object,因为E范型在java.util.ArrayList上面的为Object
            addMethod.invoke(strings, "asdfasd");
            System.out.println(strings);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

运行结果是

[12, asdfasd]

ps:想要达到运行时添加数据造成范型约束失效,只有通过反射获取Method对象执行。为什么不能运行时通过用户输入数据添加数据对象让范型失效,因为用户输入数据都是String类型,底层时char的,所有得到的int或者其它的时通过类型转换得到的,其中没有使用到范型,这儿新手容易混淆。

猜你喜欢

转载自blog.csdn.net/zq1994520/article/details/82828650