资讯专栏INFORMATION COLUMN

《Java编程思想》--持有对象--泛型和类型安全的容器

nemo / 1503人阅读

摘要:层次结构如上所示,的子类都可以作为集合的元素加入到集合中,并且不会有任何影响。在实际编码中一般都建议使用类型安全的容器,这样不容易出错,出错也会在编译期间就会展现出来。

概述

说起类型安全的容器,那么什么是类型不安全的容器呢?容器用来存储数据,常见的存储数据的容器有数组和集合,数组有以下特点:

长度固定

只能存储同一种类型的数据

因为数组只能存储同一种数据类型的数据,那么它就是类型安全的容器,因为集合可以存储任意类型的数据,比如我可以在List中存储一个Apple、一个Orange,但是在取的时候我不知道它们是什么,只知道它们是Object,这样,我以为取出来的是Apple,但是取出来了一个Orange,我又想要用Apple的种子种苹果,但是涨出来发现时橘子。

实例 类型不安全的容器
class Apple{
    private static long counter;
    private final long id = counter++;
    public long id(){
        return id;
    }
}

class Orange{

}


public class ApplesAndOrangesWithoutGenerics {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        ArrayList apples = new ArrayList();
        for(int i = 0; i<3; i++){
            apples.add(new Apple());
        }

        apples.add(new Orange());

        for (int i = 0; i

@SuppressWarnings:不受检查的异常,也就是可以抑制警告信息

存储进去三个Apple对象和一个Orangle对象

想取出Orange的id属性

出现运行时异常ClassCastException: net.sailfishc.holding.Orange cannot be cast to net.sailfishc.holding.Apple

类型安全的容器(泛型)
class Apple{
    private static long counter;
    private final long id = counter++;
    public long id(){
        return id;
    }
}

class Orange{

}


public class ApplesAndOrangesWithoutGenerics {
   
    public static void main(String[] args) {
        ArrayList apples = new ArrayList();
        for(int i = 0; i<3; i++){
            apples.add(new Apple());
        }

        // apples.add(new Orange());

        for (int i = 0; i

在创建List的时候加入了泛型,使其只能放入Apple

在试图加入Orange的时候会出现编译器异常

在取对象的时候不需要强制转换为Apple,因为编译器已经知道存储的是Apple

向上转型使用泛型

明确指定某个类型作为泛型参数的时候,并不仅限于将该对象放置到容器中,向上转型也可以像其他类型一样作用于泛型。

class GrannySmith extends Apple{}
class Gala extends Apple{}
class Fuji extends Apple{}
class Braeburn extends Apple{}

public class GenericsAndUpcasting {
    public static void main(String[] args) {
        ArrayList apples = new ArrayList();
        apples.add(new Gala());
        apples.add(new GrannySmith());
        apples.add(new Fuji());
        apples.add(new Braeburn());
        for (Apple apple : apples) {
            System.out.println(apple);
        }

        List list1 = new ArrayList();
        List list2 = new LinkedList();
    }
}

Apple

GrannySmith

Gala

Fuji

Braeburn

层次结构如上所示,Apple的子类都可以作为集合的元素加入到集合中,并且不会有任何影响。

在实际编码中一般都建议使用类型安全的容器,这样不容易出错,出错也会在编译期间就会展现出来。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65137.html

相关文章

  • Java 持有对象(11)

    摘要:如果一个程序只包含固定数量且其生命周期都是已知的对象,那么这是一个非常简单的程序。 如果一个程序只包含固定数量且其生命周期都是已知的对象,那么这是一个非常简单的程序。 1.泛型和类型安全的容器 通过使用泛型,可以在编译期防止将错误类型的对象放置到容器中. 2.基本概念 Java容器类库的用途是保存对象,并将其划分为两个不同的概念:Collection,Map. Collection...

    summerpxy 评论0 收藏0
  • Java 泛型总结(二):泛型与数组

    摘要:总结数组与泛型的关系还是有点复杂的,中不允许直接创建泛型数组。本文分析了其中原因并且总结了一些创建泛型数组的方式。 简介 上一篇文章介绍了泛型的基本用法以及类型擦除的问题,现在来看看泛型和数组的关系。数组相比于Java 类库中的容器类是比较特殊的,主要体现在三个方面: 数组创建后大小便固定,但效率更高 数组能追踪它内部保存的元素的具体类型,插入的元素类型会在编译期得到检查 数组可以持...

    Vultr 评论0 收藏0
  • 理解Java泛型(一)

    摘要:参数化的类型其中是参数化的类型。类型参数的实例或实际类型参数其中是类型参数的实例或实际类型参数。它们并没有重载,而且泛型中也不存在重载这一说法。除此之外,我们应该尽量地多用泛型方法,而减少对整个类的泛化,因为泛型方法更容易把事情说明白。 泛型是适用于许多许多的类型 ---《JAVA编程思想》 在Java的面向对象编程过程中, 或许你知道运用继承、接口等一系列面向对象的动作来实现代码复用...

    YFan 评论0 收藏0
  • 理解Java泛型(一)

    摘要:参数化的类型其中是参数化的类型。类型参数的实例或实际类型参数其中是类型参数的实例或实际类型参数。它们并没有重载,而且泛型中也不存在重载这一说法。除此之外,我们应该尽量地多用泛型方法,而减少对整个类的泛化,因为泛型方法更容易把事情说明白。 泛型是适用于许多许多的类型 ---《JAVA编程思想》 在Java的面向对象编程过程中, 或许你知道运用继承、接口等一系列面向对象的动作来实现代码复用...

    vboy1010 评论0 收藏0
  • Java编程思想》读后总结(一)

    摘要:前言编程思想这本书,陆陆续续读了年,终于基本都浏览了一遍。每个对象对外暴露接口,程序通过对象暴露的接口向对象发送消息,获取该对象的服务能力。异常处理异常处理,为编写程序阶段提供了一种预见性的防止程序崩溃的出路。 前言 《Java编程思想》这本书,陆陆续续读了1年,终于基本都浏览了一遍。通过这本书,试图理解作者的想法,才真的体会到Java思想。感谢本书的作者,不仅讲述了java的语法,更...

    hufeng 评论0 收藏0

发表评论

0条评论

nemo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<