zoukankan      html  css  js  c++  java
  • Java Generics and Collections-2.1

    2.1 子类化以及替换原理

    为什么List<Integer> 不是List<Number> 的子类?

    首先看下面的代码,这段代码是编译不过的
    
    package java_generics_collections.chap2;
    
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by jintaox on 2016/3/21.
     */
    public class Test_2_1 {
        @Test
        public void test_01() throws Exception {
            List<Integer> ints = new ArrayList<>();  //a
            ints.add(3);//b
            ints.add(4);//c
            List<Number> nums = ints;//d
            nums.add(new Double(3.14));//e
        }
    }
    

    假如,List 是List的子类型,首先List 中的add方法接受一个T类型的变量,因此,它们分别接受Integer和Number
    当代码运行到d处时不会编译不过,那么当运行到e处时,因为ints的add方法接受一个Integer,而nums的add方法接受一个Number类型,
    由于多态,当调用nums.add()时,实际调用为子类的add方法,那么其接受为Integer型,而给出的确实Double型,而Integer和Double是不能互换的。也就是说,根据Java的泛型规范,这样是不可以的。
    因此,对于Son extends Father的情况,List<Son>不是List<Father>的子类,把它们认为是不想关的好了。

  • 相关阅读:
    Django学习2
    Django学习1
    python 基于tcp协议的文件传输3_解决粘包问题
    python socketserver
    python hashlib
    python struct模块
    python json 模块
    python socket模块
    13暑假集训#10 总结
    hdu 4493 卡输入输出
  • 原文地址:https://www.cnblogs.com/xiaojintao/p/5303375.html
Copyright © 2011-2022 走看看