黑马程序员:Java基础总结----泛型(高级)
ASP.Net+Android+IO开发
、
.Net培训
、期待与您交流!
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可。
new
ArrayList<String>();
new
ArrayList<Integer>();
out
.println(arr1.getClass() == arr2.getClass());
// true
"add"
, Object.
class
).invoke(arr2,
"wanqi"
);
out
.println(arr2);
整个称为ArrayList<E>
泛型类型
ArrayList<E>中的E称为类型变量或
类型参数
整个ArrayList<Integer>称为
参数化的类型
ArrayList<Integer>中的Integer称为类型参数的实例或
实际类型参数
ArrayList<Integer>中的<>念着typeof
ArrayList称为
原始类型
参数化类型可以引用一个原始类型的对象,编译报告警告,例如,Collection<String> c = new Vector();//可不可以,不就是编译器一句话的事吗?
原始类型可以引用一个参数化类型的对象,编译报告警告,例如,Collection c = new Vector<String>();//原来的方法接受一个集合参数,新的类型也要能传进去
Vector<String> v = new Vector<Object>(); //错误!///不写<Object>没错,写了就是明知故犯
Vector<Object> v = new Vector<String>();
//也错误!
正确:Vector<? extends Number> x = new Vector<Integer>();
限定通配符的下边界:
正确:Vector<? super Integer> x = new Vector<Number>();
Vector<Integer> vectorList[] = new Vector<Integer>[10];
"java.lang.String"
);
"java.lang.String"
);
//错误
//错误
正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<? extends Number> x = new Vector<String>();
限定通配符的下边界:
正确:Vector<? super Integer> x = new Vector<Number>();
错误:Vector<? super Integer> x = new Vector<Byte>();
new
HashMap<String, Integer>();
"wanqi"
, 18);
"zhanwen"
, 28);
for
(Map.Entry<String, Integer> entry : set) {
static
void
main(String[] args)
throws
Exception {
'a'
);
""
);
new
int
[1]);
public
static
<T>
void
f(T a) {
out
.println(a.getClass().getName());
public
<T> T add (T a,T b){
//return a+b; 未定义方法
return
null
;
swap(new int[3],3,5);语句会报告编译错误。
4,也可以用类型变量表示异常,称为参数化的异常,可以用于方法的throws列表中,但是不能用于catch子句中。
5,在泛型中可以同时有多个类型参数,在定义它们的尖括号中用逗号分,例如:
public static <K,V> V getValue(K key) { return map.get(key);}
public
static
<T> T auto(Object obj) {
return
(T) obj; }
public
static
<E>
void
print(Collection<E> cols) {
for
(E obj : cols) {
out
.println(obj);
public
static
<T>
void
copy(Collection<T> col, T[] arr) {
for
(
int
i = 0; i < arr.
length
; i++) {
Demo<T>{
private
T
a
;
public
T getA() {
return
a
;
public
void
setA(T a) {
this
.
a
= a;
在对泛型类型进行参数化时,类型参数的实例必须是引用类型,不能是基本类型。
当一个变量被声明为泛型时,只能被实例变量、方法和内部类调用,而
不能被静态变量和静态方法调用。因为静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数
Method |
getDeclaredMethod(String name, Class<?>... parameterTypes)返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 |
Type[] |
getGenericParameterTypes()按照声明顺序返回 Type 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型的。 |
接口 ParameterizedType extends Type方法摘要 |
|
|---|---|
Type[] |
getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组。 |
Type |
getOwnerType()返回 Type 对象,表示此类型是其成员之一的类型。 |
Type |
getRawType()返回 Type 对象,表示声明此类型的类或接口。 |
private
Vector<Date>
dates
=
new
Vector<Date>();
public
void
setDates(Vector<Date> dates) {
this
.
dates
= dates;
public
static
void
main(String[] args)
throws
Exception {
class
.getMethod(
"setDates"
, Vector.
class
);
out
.println(
"setDates("
+ ((Class) pType.getRawType()).getName()
"<"
+ ((Class) (pType.getActualTypeArguments()[0])).getName()
">)"
);
ASP.Net+Android+IO开发
、
.Net培训
、期待与您交流!
黑马程序员:Java基础总结----泛型(高级)的更多相关文章
- 黑马程序员——JAVA基础之泛型和通配符
------- android培训.java培训.期待与您交流! ---------- 泛型: JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...
- 黑马程序员----java基础笔记中(毕向东)
<p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...
- 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)
正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G QQ 1481135711 这是我总 ...
- 黑马程序员----java基础笔记上(毕向东)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...
- 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象
------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...
- 黑马程序员——JAVA基础之语法、命名规则
------- android培训.java培训.期待与您交流! ---------- 1.java语言组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组. 2.java关键字:被Jav ...
- 黑马程序员——JAVA基础之JDK1.5新特性高级for循环和可变参数
------- android培训.java培训.期待与您交流! ---------- 高级for循环 格式: for(数据类型 变量名 : 被遍历的集合(Collection)或者数组) { ...
- 黑马程序员——JAVA基础之File类,递归,打印流,合并切割流
------- android培训.java培训.期待与您交流! ---------- File类 用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作. File对象可以作为参数传递 ...
- 黑马程序员——JAVA基础之多线程的安全问题
------- android培训.java培训.期待与您交流! ---------- 导致多线程出现问题的一个特殊的状态:就绪.具备了执行资格,但是还没有获取资源. 导致安全问题的出现的原因: 1. ...
- 黑马程序员——JAVA基础之简述设计模式
------- android培训.java培训.期待与您交流! ---------- 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用.多数人知晓 ...
随机推荐
- POJ 2031 prim
Building a Space Station Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4400 Accepted: 2 ...
- 基于visual Studio2013解决面试题之1203转16进制输出
题目
- Androidclient与服务端(jsp)之间json的传输与解析【附效果图附源代码】
近期有个项目须要用到json的传输,之前不是太了解,在网上找了些相关资料,写了一个小小的demo,能够实现基本功能:androidclient发送json到服务端,服务端使用jsp接收,解析后以jso ...
- jquery-easyui实现页面布局和增删改查操作(SSH2框架支持)转载
http://blessht.iteye.com/blog/1069749/ 已注册:ooip 关联的csdn 前几天心血来潮用jquery-easyui+spring.struts2.hiberna ...
- ASP.NET中IsPostBack详解(转载)
1.IsPostBack介绍Page.IsPostBack是一个标志:当前请求是否第一次打开. 调用方法为:Page.IsPostBack或者IsPostBack或者this.IsPostBack或者 ...
- 创建webservice 用service.xml配置(复杂点的方法)
用Axis2实现Web Service,虽然可以将POJO类放在axis2/WEB-INF/pojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中.这 ...
- Effective C++_笔记_条款11_在operator=中处理“自我赋值”
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为什么会出现自我赋值呢?不明显的自我赋值,是“别名”带来的结果: ...
- awk 正则表达式
awk 正则表达式.正则运算符详细介绍 前言:使用awk作为文本处理工具,正则表达式是少不了的. 要掌握这个工具的正则表达式使用.其实,我们不必单独去学习它的正则表达式.正则表达式就像一门程序语言,有 ...
- 记录路径dp-4713-Permutation
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4713 题目大意: 题意同HDU 3092这不过这题要输出路径. 解题思路: 思路同HDU 3092. ...
- [置顶] ubuntu 和 win7 远程登陆 + vnc登陆
ubuntu 和 win7 远程登陆: 第一种(通过win7自带的远程桌面来连接ubuntu) 1. windows7配置 我的电脑->属性->远程设置.-----允许远程连接 2. ub ...