引出泛型,在程序中的使用和作用。

/**

*    泛型的概述

*【目标:泛型的由来和基本使用】

1,因为集合可以存储的对象类型是任意的,在取出进行向下转型时,容易发生ClassCastException。

所以JDK1.5以后就有了解决这个问题的技术:泛型。

2,泛型的原理:其实就是在操作的元素类型不确定时,通过传递参数的形式来明确类型。

3,泛型的体现就是 <参数类型变量>用于接收具体的实际元素类型。

4,泛型技术在集合框架中应用非常广泛,只要记住:在使用类或者接口时,如果接口上有明确<>泛型。

在使用时,就传递所需的数据类型即可。不传递会出现警告类型不安全提示。

5,了解:泛型技术是用在编译器部分的技术,一旦类型检查正确,

生成的class文件中就没有泛型标记了:这是的泛型的擦除。

 6,泛型的好处:

    6.1 将运行时期的ClassCastException异常转移到编译时期通过编译失败体现。

    6.2 避免了强制转换的麻烦。

7,其实泛型的使用就是往定义了泛型的类或者接口的<>中传递类型参数。

【学习结果】

1,表述出泛型技术的特点和好处。

2,泛型在集合对象中的使用,要求写集合代码时必须加入泛型。★★★★★

*/

public class GenericDemo {

    public static void main(String[] args) {
        //学习泛型之后的正确的做法,加入泛型
        List<String> list = new ArrayList<String>();
        list.add("abc");
        list.add("ab是啊c");
        list.add("ab是c");
//        list.add(6);    编译报错,这就是泛型的好处体现之一,
        //将运行时期的ClassCastException异常转移到编译时期通过编译失败体现。

      /*List list = new ArrayList();        实验完毕注释掉
        list.add("string");                    实验完毕注释掉
        list.add("5");                        实验完毕注释掉
        list.add(6);    //发现问题: 编译并不报错
      */
        /*我们遍历一下集合,看看有没有其他问题*/
        for(Iterator<String> it = list.iterator();it.hasNext();){
//            Object obj = it.next();        实验完毕注释掉
//            System.out.println(obj);    实验完毕注释掉
            /*    打印结果也并无异常
                 string
                5
                6
             * */
            /*为什么没问题呢?因为System.out.println(obj.toString()),调用了toString方法*/

            /*那么现在,需求改变,需要打印字符串长度,做法如下*/
            String str = /*(String)*/ it.next(); //字符串长度是String的特有方法,强转是必然的
            /*注意: 定义了泛型,自然不需要强转了
             *这也是泛型好处的另一种体现:避免了强转的麻烦!*/

            System.out.println(str.length());//思考:此时再输出会怎么样?
            /* java.lang.ClassCastException: java.lang.
             * Integer cannot be cast to java.lang.String
             * 异常: 类型不能转换异常.
             * 集合中存储元素时,如果存的对象很多,而且对象类型不相同,会出现安全隐患.
             * */
        }
    }
}
时间: 2024-10-14 05:56:19

引出泛型,在程序中的使用和作用。的相关文章

泛型及java中的泛型

当作笔记整理的~~~ 首先,引出堆对象这个概念. 什么是堆对象,就是程序在运行过程中可以随时建立或者删除的对象,可以用new运算符(或malloc函数)或者delete运算符(或free函数).泛型可以看作是一类堆对象. 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明. 各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型. 泛型的定义主要有两种:1.在程序编

.net学习之泛型、程序集和反射

一.泛型1.CLR编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码——并不进行泛型的实例化,T在中间只充当占位符.例如:MyList 类型元数据中显示的<T> 2.执行的时候,当JIT编译器第一次遇到MyList<int>时,将用int替换“范型版”IL代码与元数据中的T—进行泛型类型的实例化.例如 :Main函数中显示的<int> 3.什么是泛型泛型是具有占位符(类型参数)的类.方法.结构.接口 4.泛型类的继承public class F

在 WPF 程序中使用 MVVM 模式

MVVM 模式是一个很久之前的技术了,最近因为一个项目的原因,需要使用 WPF 技术,所以,重新翻出来从前的一段程序,重温一下当年的技术. MVVM 模式 MVVM 实际上涉及三个部分,Model, View 和 ViewModel ,三者的关系如下图所示. 在三部分的关系中,视图显示的内容和操作完全依赖于 ViewModel. Model 是应用程序的核心,代表着最大.最重要的业务资产,因为它记录了所有复杂的业务实体.它们之间的关系以及它们的功能. Model 之上是 ViewModel.Vi

理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL

本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最初关注点中:为什么语句在应用程序中慢,但是在SSMS中快?到目前为止,都是在说存储过程的情况.而存储过程的问题通常是因为SET ARITHABORT的不同设置项的原因.如果你的应用不使用存储过程,而是通过中间层提交客户端的查询,那么也有几个原因可能让你的查询因为不同的缓存条目从而使得在SSMS和应用程序中的运

理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程

接上文:理解性能的奥秘--应用程序中慢,SSMS中快(1)--简介 本文介绍SQL Server如何编译存储过程并使用计划缓存.如果你的应用程序完全没有用到存储过程,而是直接使用SQL语句提交请求,那么本文大部分内容也是有效的.但是关于动态SQL的编译会在后面章节介绍,这里重点关注让人头痛的存储过程问题. 什么是存储过程? 虽然这个问题有点愚蠢,但是实际的问题是:什么对象有自己的查询计划?SQL Server为下面四类对象创建查询计划: 存储过程. 标量用户自定义函数. 多步表值函数. 触发器

1.仓储模式在MVC应用程序中的使用

目录 1.仓储模式在MVC应用程序中的使用 2.泛型仓储模式在MVC应用程序中的使用 3.MVC Code-First和仓储模式的应用 4.待续.... 这篇文章中,我会解释仓储模式在MVC程序中的使用. 首先,我们需要理解什么是仓储模式[repository Pattern],来看看下面的图片 没有使用仓储模式的MVC应用程序:      使用了仓储模式的MVC应用程序: 仓储模式,是一个抽象层,它将数据库的访问逻辑,映射到实体的访问逻辑. 下面,我们来看做一个应用程序,来体验一下仓储模式吧.

Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)

本文将介绍如何在 .NET Core 环境下,借助 SignalR 在小程序内使用 WebSocket.关于 WebSocket 和 SignalR 的基础理论知识不在这里展开,已经有足够的参考资料,例如参考 SignalR 的官方教程:https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-2.1 我们先看一下完成本教程内容后,在小程序内实现的 WebSocket 效果: 私有及群发消息

在Android程序中使用已有的SQLite数据库

已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的数据库的文章,于是在谷歌上找到这篇英文文章,依照它的步骤,測试成功.决定把这篇文章大致的翻译一下,想看原文的能够点击这里:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ .

C程序中让两个不同版本的库共存

原文连接:http://blog.gotocoding.com/archives/875 今天有同学提出,如何在一个C程序中让两个不同版本的库共存. 首先想到的方案是,把其中一个版本的库函数全部重命名,比如把每一个函数名都加一个_v2的后缀. 人工替换到没什么,但是如果函数个数超过10个,就有点不拿人当人使了. 而使有工具去替换就会遇到一些棘手的问题,如何识别哪些是函数,哪些是系统函数(系统函数不需要添加后缀)等. 随后想到的另一个解决方案是C++的方案,为其中一个版本库中的所有文件添加命名空间