(一)关于java泛型的学习总结(泛型方法、泛型擦除)
目录概要
一、泛型方法
二、利用泛型方法的特性实现代码的简化
三、 关于泛型的擦除
四、无界通配符和原生类型区别
五、转型和警告
泛型
一般的类中的属性或方法的参数,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写试用于多种类型的代码,这种限制对代码的束缚就会很大。
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泛型的学习总结(泛型方法、泛型擦除)的更多相关文章
- Java语法基础学习DayTwelve(泛型)
一.泛型(Generic)在集合中的使用 1.作用 (1)解决元素存储的安全问题 (2)解决获取数据元素时,需要类型强转的问题 2.代码案例 //在集合没有使用泛型的情况下 List list = n ...
- Java泛型学习笔记--Java泛型和C#泛型比较学习(一)
总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...
- 【原】Java学习笔记027 - 泛型
package cn.temptation.test; import java.util.ArrayList; import java.util.Iterator; public class Samp ...
- JAVA学习第四十一课 — 泛型的基本应用(一)
泛型是JDK1.5以后出现的安全机制,简化机制,提高安全性 泛型的长处 1.将执行时出现的问题ClassCastException转移到了编译时期 2.避免了强制转换的麻烦 <>在当操作的 ...
- 【Java学习笔记】泛型
泛型: jdk1.5出现的安全机制 好处: 1.将运行时期的问题ClassCastException转到了编译时期. 2.避免了强制转换的麻烦. <>: 什么时候用? 当操作的引用数据类型 ...
- java泛型简单学习
一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: //import java.util.List; public class GenericTest { public st ...
- 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的
数组和泛型容器有什么区别 要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance).逆变性(contravariance)和无关性(invariant). 若类A是类B的子类, ...
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- java泛型(一)、泛型的基本介绍和使用
现在开始深入学习java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用.泛型在java中,是一个十分重要的特性,所以要好好的研究下. 泛 型的定义:泛型是JDK 1.5的一 ...
- Java泛型解析(01):认识泛型
Java泛型解析(01):认识泛型 What Java从1.0版本号到如今的8.中间Java5中发生了一个非常重要的变化,那就是泛型机制的引入.Java5引入了泛型,主要还是为了满足在199 ...
随机推荐
- 常用的Linux发行版
Linux发行版百花齐放 [内容摘要] 如今,众多的Linux发行版百花齐放,linux的阵营日益壮大,每一款发行版都拥有一大批用户,开发者自愿为相关项目投入精力.Linux发行版可谓是形形色色,它们 ...
- Linux环境变量配置的三个方法--/etc/profile,~/.bashrc,shell
[环境配置的原因] 在windows系统下,很多软件的安装都需要设置环境变量,比如安装JAVA JDK.如果不安装环境变量,在非软件安装的目录下运行javac命令,将会报告"找不到文件&qu ...
- Google研究人员宣布完成全球首例SHA-1哈希碰撞!
2004年的国际密码讨论年会(CRYPTO)尾声,我国密码学家王小云及其研究同事展示了MD5.SHA-0及其他相关杂凑函数的杂凑碰撞并给出了实例.时隔13年之后,来自Google的研究人员宣布完成第一 ...
- 关于Eclipse启动报错,jvm版本不匹配的问题
前几天重新下了个eclipse,eclipse需要java环境才能运行起来,我当时电脑上自己装了jdk1.8,然后直接运行新下载的eclipse,说我的jvm版本是1.6,但是我不记得安装过1.6的了 ...
- Thread.interrupt()方法理解
原博客地址: 多线程编程 实战篇 (四) 不客气地说,至少有一半人认为,线程的"中断"就是让线程停止. 如果你也这么认为,那你对多线程编程还没有入门. 在java中,线程的中断(i ...
- python基础教程(十一)
迭代器 本节进行迭代器的讨论.只讨论一个特殊方法---- __iter__ ,这个方法是迭代器规则的基础. 迭代器规则 迭代的意思是重复做一些事很多次---就像在循环中做的那样.__iter__ 方 ...
- Servlet之文件的上传与下载
文件上传和文件下载是我们学JAVA Web时必不可少的模块.今天我们探讨下这个问题 文件上传: request.setCharacterEncoding("utf-8");//设置 ...
- informatica9 安装下载,安装教程 介质(文章和视频教程)(csdn讲师:Array)
Informatica学习: 参考文献:视频参考地址:http://edu.csdn.net/course/detail/5034,ETL之informatica9通关班(第二期) 1.安装介质的获 ...
- C++内存布局详解
一个由C/C++编译的程序除了存放函数二进制代码的程序代码段(code段)外,数据占用的内存大致分为以下几个部分: 1.栈区(stack) 存放局部变量.函数参数.返回数据.返回地址等.系统自动分配释 ...
- 最近见到的JS返回函数的一些题
JS返回值题一直都是考察重点,面试和笔试之中也经常涉及到,说一说我最近遇到的一些有意思的JS返回函数问题. 之前见到过一道有意思的问题,说有一个sum函数,用户可以通过sum(2,3)来取到2+3 = ...