• 从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?


    这一章节我们继续类型擦除的话题,我们将通过对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?

    1.数组

    package com.ray.ch13;
    
    public class Test {
    
    	public static void main(String[] args) {
    		Fruit[] fruits = new Apple[5];
    		fruits[0] = new Apple();
    		fruits[1] = new Fuji();
    		fruits[2] = new Fruit();
    	}
    }
    
    class Fruit {
    }
    
    class Apple extends Fruit {
    }
    
    class Fuji extends Apple {
    }

    观察上面的代码,我们能够看到。尽管定义仅仅是Fruit 的数组。可是它能够放进去Apple、Fuji等子类型的对象,由于数组是持有对象的引用,并且能够在执行时向上转型。


    2.泛型容器

    一般使用方法:

    package com.ray.ch13;
    
    import java.util.ArrayList;
    
    public class Test {
    
    	public static void main(String[] args) {
    		ArrayList<Fruit> fruits = new ArrayList<Fruit>();
    		fruits.add(new Fruit());
    		fruits.add(new Apple());
    		fruits.add(new Fuji());
    	}
    }
    
    class Fruit {
    }
    
    class Apple extends Fruit {
    }
    
    class Fuji extends Apple {
    }

    上面是我们的经常使用使用方法。定义一个List容器。泛型里面填写的是同一个类型。

    可是,我们以下将依据向上转型的特性,看看能不能像数组一样?

    样例:

    package com.ray.ch13;
    
    import java.util.ArrayList;
    
    public class Test {
    
    	public static void main(String[] args) {
    		// ArrayList<Fruit> fruits = new ArrayList<Apple>();//error
    		ArrayList<? extends Fruit> fruits = new ArrayList<Apple>();
                    // fruits.add(new Apple());//error
    		// fruits.add(new Fruit());//error
    		fruits.add(null);// 这里仅仅能是null,没有其它选择
    	}
    }
    
    class Fruit {
    }
    
    class Apple extends Fruit {
    }
    
    class Fuji extends Apple {
    }

    观察上面的代码,本来我们想跟数组一样,在创建list的时候仅仅是把泛型定义为Fruit的子类,可是。编译器抛异常。

    这是由于泛型不是全然定义,它仅仅是在编译器检查类型安全。在执行期就没有泛型的概念了。而当我们定义的时候是通过通配符“?”来定义,也就是说我能够放进去Fruit的本身或者子类,编译器能够知道,可是在执行期。jvm仅仅是知道放进来Object。而在创建的时候是定义了Apple子类。尽管编译器知道。可是在执行期。jvm也仅仅是知道放进来Object,这个时候在执行期就会引起类型安全的问题。因此,当我们放进去什么对象都会引起类型安全的时候,编译器仅仅能给出null这个选项,不然就必定会出现类型安全的风险。

    总的来说,由于数组是全然定义,在编译器和执行期都会进行类型检測,或者说数组本身就是持有对象,而泛型容器仅仅是在编译器检查类型安全。而在执行期全是Object,仅仅是半定义。或者说泛型容器不持有对象,才导致上面所展示的问题。


    总结:这一章节我们主要对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题。


    这一章节就到这里。谢谢。

    -----------------------------------

    文件夹






  • 相关阅读:
    Spring bean的实例化
    提交本地代码到github
    ORM框架——SQLAlchemy
    代码发布项目(三)——python操作git、代码发布流程(服务器管理、项目管理)
    代码发布项目(二)——django实现websocket(使用channels)、基于channels实现群聊功能、gojs插件、paramiko模块
    代码发布项目(一)——实现服务端主动给客户端推送消息(websocket)
    索引补充(索引种类,正确使用索引,其他注意事项,慢日志查询)
    mysql索引种类(索引种类和建立索引)
    centos6安装Docker遇到的问题(升级centos6内核)
    Django1.11下载安装xadmin
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7338024.html
Copyright © 2020-2023  润新知