目录概要

一、泛型方法

二、利用泛型方法的特性实现代码的简化

三、 关于泛型的擦除

四、无界通配符和原生类型区别

五、转型和警告

 

泛型

一般的类中的属性或方法的参数,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写试用于多种类型的代码,这种限制对代码的束缚就会很大。

Java SE5后引入了泛型的概念。泛型实现了参数化类型的概念,当我们使用类或者方法时,可以像普通的函数传参一样传递类型,Java就会自动帮我们类型转换,使得类中可以适用任意类型。

注:基本类型不能作为类型参数

一、泛型方法

基本指导原则:无论何时,比起类声明泛型,我们应该尽量使用泛型方法。如果泛型方法可取代将整个类泛型化,那么就应该只使用泛型方法,因为它可以使事情更清楚明白。对于一个static方法而言,无法访问泛型类的类型参数(静态方法独立于类),所以,如果static方法需要使用泛型,必须使其成为泛型方法。

泛型方法定义示例:

运行结果:

在此示例中,GenericMethods并不是参数化的,只有方法f()拥有类型参数。

当使用泛型类时,必须在创建对象的时候就指定类型参数的值,而使用泛型方法的时候,通常不必指明参数类型,因为编译器会为我们找出具体的类型。这称为类型判断。因此我们可以向调用普通方法一样调用f(),好像f()被无限次重载过。它甚至可以接受GenericMethods作为其类型参数。

如果调用f()时传入的是基本类型,自动打包机制就会自动将基本类型包装成对应的对象。

二、利用泛型方法的特性实现代码的简化

在正常情况下如果我们要创建一个持有List的Map,要像下面一样:

我们重复的使用了类型声明,很显然这是不好的。现在,我们可以利用泛型方法的自动检测类型的特性来简化我们的工作。

我们可以创建一个工具类,他包含各种static方法,专门来创建各种常用的容器对象:

现在我们使用工具类创建来和之前的代码比较一下:

是不是感觉代码清晰了不少?

不过这只是一个例子,在正常情况下,这个方法的使用还是要视情况而定:如果某人阅读了以上代码,他可能还需要分析工具类New,以及New所隐含的功能,这时就需要权衡。但是不得不说这一特性在某些场景还是很有用的。

三、关于泛型的擦除

在我们定义完泛型后,当编译器对代码编译时,会将我们定义的泛型替换成某种已经存在的类型。具体规则就是擦除到第一个边界:

泛型参数将擦除到第一个边界。如果没有指明,就是Object。

例如: List<?>   编译器将擦除为 List<Object>

List<? extends Student> 编译器将擦除为 List<Student>

四、无界通配符和原生类型区别

无界通配符Map<String,?>和原生类型Map有时候是不同的,使用无界通配符可以增加一个信息:我想用Java泛型来编写这段代码,而不是原生类型,但是当前情况,泛型参数可以持有任何类型。

例如: Map<String ,?> map1=new HashMap();.//会产生警告,没有指定泛型

Map map2=new HashMap();//不会参数警告

五、转型和警告

当使用readObject对对象转型时,可以使用JDK5中的新的转型形式,通过泛型类转型

例如:

LIst<Student> w1`=List.class.cast(in.readObject());

//不能用下面的方式

List<Studetn>w2=List<Student>.class.cast(in.readObject());

(一)关于java泛型的学习总结(泛型方法、泛型擦除)的更多相关文章

  1. Java语法基础学习DayTwelve(泛型)

    一.泛型(Generic)在集合中的使用 1.作用 (1)解决元素存储的安全问题 (2)解决获取数据元素时,需要类型强转的问题 2.代码案例 //在集合没有使用泛型的情况下 List list = n ...

  2. Java泛型学习笔记--Java泛型和C#泛型比较学习(一)

    总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...

  3. 【原】Java学习笔记027 - 泛型

    package cn.temptation.test; import java.util.ArrayList; import java.util.Iterator; public class Samp ...

  4. JAVA学习第四十一课 — 泛型的基本应用(一)

    泛型是JDK1.5以后出现的安全机制,简化机制,提高安全性 泛型的长处 1.将执行时出现的问题ClassCastException转移到了编译时期 2.避免了强制转换的麻烦 <>在当操作的 ...

  5. 【Java学习笔记】泛型

    泛型: jdk1.5出现的安全机制 好处: 1.将运行时期的问题ClassCastException转到了编译时期. 2.避免了强制转换的麻烦. <>: 什么时候用? 当操作的引用数据类型 ...

  6. java泛型简单学习

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: //import java.util.List; public class GenericTest { public st ...

  7. 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的

    数组和泛型容器有什么区别 要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance).逆变性(contravariance)和无关性(invariant). 若类A是类B的子类, ...

  8. java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  9. java泛型(一)、泛型的基本介绍和使用

    现在开始深入学习java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用.泛型在java中,是一个十分重要的特性,所以要好好的研究下. 泛 型的定义:泛型是JDK 1.5的一 ...

  10. Java泛型解析(01):认识泛型

    Java泛型解析(01):认识泛型 What      Java从1.0版本号到如今的8.中间Java5中发生了一个非常重要的变化,那就是泛型机制的引入.Java5引入了泛型,主要还是为了满足在199 ...

随机推荐

  1. 京东地址导航js+css

    HTML------------------------------------------------<!DOCTYPE html><html lang="en" ...

  2. Python常用排序算法

    1.冒泡排序 思路:将左右元素两两相比较,将值小的放在列表的头部,值大的放到列表的尾部 效率:O(n²) def bubble_sort(li): for i in range(len(li)-1): ...

  3. 图解如何安装MySQL5.0

    如何安装MySQL5.0数据库.. mysql-5.5.50-winx64下载地址: http://www.jb51.net/softs/363920.html 我的电脑因为提前安装了.所以需要卸载一 ...

  4. View.post() 不靠谱的地方你知道吗?

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章. 未经允许,不得转载. 一.前言 有时候,我们会需要 ...

  5. 聊聊GIS中那些坐标系

    从第一次上地图学的课开始,对GIS最基本的地图坐标系统就很迷.也难怪,我那时候并不是GIS专业的学生,仅仅是一门开卷考试的专业选修课,就没怎么在意. 等我真正接触到了各种空间数据产品,我才知道万里长征 ...

  6. 常用px,pt,em换算及区别

    pt (point,磅):是一个物理长度单位,指的是72分之一英寸. px (pixel,像素):是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(D ...

  7. 【Linux】windows-linux、linux-linux文件互传

    一.Linux下文件互传,scp命令实例 1.Linux下目录复制:本机->远程服务器 scp -r /home/abc/test1(本机目录路径)  root@192.168.0.1:/hom ...

  8. JavaWeb(八)JQuery

    jQuery 市场用得比较多两个框架: jQuery 比较适合做一些互联网 的应用(12306.com,蘑菇街,美丽说,聚美) extjs 比较适合做后台管理系统(电商(订单管理),银行,电信) 核心 ...

  9. Linux安装解压缩版jdk

    #解压到指定目录 tar zxvf ./jdk-7-Linux-i586.tar.gz  -C /usr/lib/jvm 配置环境变量 #vi  /etc/profile 编辑文件,在最后添加: ex ...

  10. 分享45个android实例源码,很好很强大.收藏吧!!!

    andriod闹钟源代码 http://www.apkbus.com/android-20974-1-1.html android源码分享之指南针程序 http://www.apkbus.com/an ...