Java基础巩固----泛型
注:参考书籍:Java语言程序设计。本篇文章为读书笔记,供大家参考学习使用
1.使用泛型的主要优点是能够在编译时而不是在运行时检查出错误,提高了代码的安全性和可读性,同时也提高了代码的复用性。
1.1如何理解泛型的使用提高了代码的安全性?
答:例如这样一段代码:
ArrayList<Date> arrayList = new ArrayList<Date>();
arrayList.add(new Date());
arrayList.add(“data”);
这段代码在编译时会报错,因为ArrayList只能存储同一种类型的数据。
如果这段代码更改为非泛型类型的话,如下:
ArrayList arrayList = new ArrayList();
arrayList.add(new Date());
arrayList.add(“data”);
而这段代码在编译时就不会报错,而是在运行时会出现出错,所以,使用泛型可以提高代码的安全性。
1.2如何理解提高了代码的复用性?
答:例如,创建一个泛型公共方法,则这个方法就可以处理多种数据类型,不必再为每一种数据类型单独的编写方法,故提高了代码的复用性。
2.定义泛型类
方法:在类名后面添加两个尖括号,在尖括号中填写类型形参(此时的类型形参一般使用T或者E,当然也可以使用其他的标识),多个形参之间使用逗号隔开,例如:
public class GenericStack<T>{
}
警告:假设创建一个上面类的对象,形式为:GenericStack<String> genericStack = new GenericStack<String>();这可能会误导我们认为GenericStack的构造函数为public GenericStack<T>();其实这是错误的,它的构造函数应该为:public GenericStack();
可以定义一个类或者一个接口作为泛型或者接口的子类型。例如,在Java API中,java.lang.String类被定义为实现了Comparable接口,如下所示:
public class String implements Comparable<String>
3.定义泛型方法
格式:在方法的返回类型前添加一对尖括号,然后在尖括号中填写类型形参,多个类型形参之间使用逗号隔开。为了调用泛型方法,需要将实际类型放在尖括号内作为方法名的前缀,例如:
GenericMethodDemo.<Integer>print(integers);
GenericMethodDemo.<String>print(strings);
4.受限的泛型类型:将泛型指定为另一种类型的字类型
例如:public <E extends GeometricObject> boolean equalArea(){}
注:非受限类型<E>和受限类型<E extends Object>是一样的。
5.原始类型:不使用类型参数的泛型类称为原始类型(raw type);
6.通配泛型:通配泛型有3中形式:?、?extends T、? super T。
第一种形式称为非受限通配(unbounded wildcard),它和? extends Object效果一样
第二种形式称为受限通配(bounded wildcard),它表示T或者T的一个未知字类型
第三种形式称为下线通配(lower-bound wildcard),表示T或T的一个未知父类型
7.泛型消除和对泛型的限制
泛型是使用一种称为类型消除的方法来实现的。编译器使用泛型类型消息来编译代码,但是随后会消除它。因此,泛型信息在运行时是不可用的。这种方法可以使泛型代码向后兼容使用原始类型的遗留代码。
由于泛型类型在运行时被消除,因此,对于如何使用泛型类型是有一些限制的:
限制1:不能使用new E();
因为运行时执行的是new E(),但是运行时泛型类型E是不可用的。
限制2:不能使用new E[],不能使用泛型类型参数创建数组
E[] elements = new E[capacity];
可以通过创建一个Object类型的数组,然后将它的类型转换为E[]来规避这个限制,如下所示
E[] elements = (E[])new Object[capacity];
但是这种使用类型转化的方式会导致一个免检的编译警告。该警告之所以出现是因为编译器无法确保在运行时类型转换是否成功。这种类型的编译警告是对java泛型的限制,也是无法避免的。
不允许使用泛型类创建泛型数组,例如,下面的代码是错误的:
ArrayList<String>[] list = new ArrayList<String>[10];
可以使用下面的代码来规避这种限制:
ArrayList<String>[] list = (ArrayList<String>[])new ArrayList[10];
这样会得到一个警告。
限制3:在静态环境下不允许类的参数是泛型类型
由于泛型类的所有实例都有相同的运行时类,所以泛型类的静态变量和方法是被它的所有实例所共享的。因此,在静态方法中、数据域、或者初始化语句中,为了类而引用类型参数是非法的。例如,下面的代码是非法的:
public class Test<E>{
public static void m(E ol){ //非法
}
public static E ol; //非法
static{
E o2;//非法
}
}
限制4:异常类不能是泛型的
Java基础巩固----泛型的更多相关文章
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- 黑马程序员——JAVA基础之泛型和通配符
------- android培训.java培训.期待与您交流! ---------- 泛型: JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...
- Java基础知识--泛型
什么是泛型?为什么使用泛型? 泛型,就是参数化类型.提到参数,最熟悉的就是定义方法时候的形参,然后调用此方法时传递实参.顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也 ...
- Java基础:泛型
Java的泛型是什么呢, 就是类型的參数化,这得类型包含方法參数和返回值.也就是原本该是确定类型的地方换成了变量,把类型的确定时间向后延迟了. 在之前,学过"重载"的概念,重载是什 ...
- 【Java基础】泛型
Num1:请不要在新代码中使用原生类型 泛型类和接口统称为泛型.每种泛型定义一组参数化的类型,构成格式是:类或接口名称,接着用<>把对应于泛型形式类型的参数的实际参数列表括起来.比如:Li ...
- 黑马程序员——【Java基础】——泛型、Utilities工具类、其他对象API
---------- android培训.java培训.期待与您交流! ---------- 一.泛型 (一)泛型概述 1.泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制 ...
- Java基础之泛型——使用二叉树进行排序(TryBinaryTree)
控制台程序. 1.实现针对容器类的基于集合的循环 为了让容器类类型的对象能够在基于集合的for循环中可用,类必须并且只需要满足一个要求——必须实现泛型接口java.lang.Iterable<& ...
- java基础之 泛型
泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...
- Java基础 Day14 泛型
//为什么要使用泛型 //1.解决元素存储的安全性的问题 //2.解决获取元素时,须要类型转换的问题 //未使用泛型 package org.tizen.test; import java.util. ...
- 【Java基础】泛型的一些总结
什么是泛型 泛型其实可以理解为一种广泛的类型,啥类型都型,当然,这种泛是指定义时可以广泛,但是使用时必须确定类型.也就是说,当不清楚未来使用哪种类型时,定义为泛型.可以支持泛型类,泛型接口,泛型方法, ...
随机推荐
- 教程-Delphi7 自带控件安装对应表
原来的控件delphi7里何处寻? 经常有朋友提这样的问题,“我原来在delphi5或者delphi6中用的很熟的控件到哪里去了?是不是在delphi7中没有了呢?这是不是意味着我以前写的代码全都不能 ...
- 解决IE下iframe默认有白色背景的bug
又是一个IE莫名其妙的bug:做了一个弹出层,层里面是一张透明图片,IE下的iframe默认会有一个白色的背景,所以当iframe的外围背景并不是白色的时候,这个iframe就会显得非常的“与众不同” ...
- oracle 表空管理方式(LMT)、ASSM段管理方式、一级位图块、二级位图块、三级位图块。
今天是2013-12-16,今天和明天是我学习oracle生涯中一个特殊的日子.今天晚上进行了一下表空间管理方式的学习,在此记录一下笔记. 对于oracle数据库最小i/0单位是数据块,最想分配空间单 ...
- JBPM学习(六):详解流程图
概念: 流程图的组成: a. 活动 Activity / 节点 Node b. 流转 Transition / 连线(单向箭头) c. 事件 1.流转(Transition) a) 一般情况一个活动中 ...
- wechat server的配置
一 服务器地址 https://github.com/donal-tong/wechat4server 包括源代码及数据库脚本放在dump文件夹里 1.根据sql脚本创建需要的数据库hcapi,然后命 ...
- 硬菜点播台 | MySQL阿里实践经典案例之参数调优最佳实践
http://mp.weixin.qq.com/s?__biz=MzA4NjI4MzM4MQ%3D%3D&mid=512708319&idx=1&sn=6af5f424d7cd ...
- qt QSqlQuery
QT数据库QSqlQuery SQL执行操作 QSqlQuery提供了对数据库记录的Select.Insert.Update.Delete操作. SELECT操作: QSqlQuery query ...
- 常见android手机分辨率
4:3 VGA 640*480 (Video Graphics Array) QVGA 320*240 (Quarter VGA) HVGA 480*320 (Half-size VGA) ...
- C#数据类型中的decimal精度比double更高
decimal 128bit大小 有效数字:28~29,虽然decimal类型有比浮点类型更高的精度,但它的范围更小.故double转decimal有可能发生溢出错误,此外,decimal的计算速度稍 ...
- 不支持的关键字:“provider connection string”报错信息及解决方案
今天在部署公司开发框架的时候 ,登录系统之后调用代办列表的时候就报错了 总线调用契约XX.Service.Contracts.IXXService上的GetXXCount方法时出错. Resoluti ...