List 泛型安全的一点感悟

来源:互联网 发布:在淘宝上怎么买微信号 编辑:程序博客网 时间:2024/03/29 18:26

今天刚学了genetic 做了几个实验感觉如下
    当我们使用的是泛型安全的机制的时候 jvm离得规范就是在编译的时候进行验证 如果不安全的编译

时不会通过的
      还有就是泛型的检查机制就是只检查本身的 这句话的意思就是说
            List<Integer> ints = new ArrayList<Integer>();//这个含义就是告诉编译器 ints 这

个变量时<Integer>安全的
            List ints = new ArrayList<Integer>();//这个虽然说的是指向的是一个<Integer>安全

的对象 但是本身的限制机制却是List 就是说是什么都没有
            如果我们执行的是ints.add("jianke");这个是可以编译通过的
            就算我们运行都是可以成功的
这个例子的前提就是必须的进行 类型兼容 也就是说编译器是检查两边的类型是不是兼容
 
但是当我们这么写的话 
                List<Integer> ints = new ArrayList<Integer>();
        List<Number> num = ints;
        ints.add("jianke");
        System.out.println(ints.get(0));
   这个在运行的时期是会报错的 这是为什么 但是编译器报的不是 不兼容的类型 而是
      符号: 方法 add(java.lang.String)
      位置: 接口 java.util.List<java.lang.Integer>
                ints.add("jianke");
这也就是说编译器会将你的根据你的变量的类型进行将你的方法接口的传入参数进行  规定就是将这个

占位符E改成你的限制类型
如果我们是这么写的话List<Integer> ints = new ArrayList<Integer>();
        List<Number> num = ints;
        num.add("jianke");
那么他显示的是 符号: 方法 add(java.lang.String)
      位置: 接口 java.util.List<java.lang.Number>
                ints.add("jianke"); 知道是什么编译器是怎么怎么检查的了


       但是当我们这样写的话
             List<Integer> ints = new ArrayList<Integer>();
        List<Number> num = ints;
   就是说去掉最后一行 那么却是显示的是不兼容的类型 这也就是说这个好像告诉我们在泛型中

parameType 是不能向上传递的 这和类的使用不一样的 如果不相信的话可以自己写一个类测试一下
                List<Integer> ints = new ArrayList<Integer>();
        List<Son>  parent = new ArrayList<Son>();
        List<Parent> son = parent;
但是如果实验Object 的话也是一样的 这就说明的是不允许继承的参数传递

上文中或许为什么
List<Integer> ints = new ArrayList<Integer>();
        List<Number> num = ints;
        ints.add("jianke");
和List<Integer> ints = new ArrayList<Integer>();
        List<Number> num = ints;
        num.add("jianke");
不同的错误可以看出的是编译器检查的机制就是当检查完一个之后 并不是继续进行下一行的检查而是把

这个泛型对象List的在这个main中的的所有的运用都检查一遍 然后再向下有序的检查
 

原创粉丝点击