Java基础加强-泛型
/*泛型*/ (泛型是给编译器看的)
泛型是提供给 /*javac编译器使用的*/,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,
编译器编译带类型带类型说明的集合时,会去掉 "类型" 信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样
由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据
例如:用反射得到集合,再反射调用该集合的add方法即可
/*了解泛型*/
1.参数化类型与原始类型的兼容性
/*参数化类型和原始类型可以相互引用*/ 如4.
2.参数化类型不考虑类型参数的继承关系
/*即Vector<Object> v1 = new Vevtor<String>() 错误的! 反过来也是一样的*/
3.在创建数组实例时,数组的元素不能使用参数化的类型
/*Vector<Integer> vectorList[] = new Vector<Integer>[10] 错误的!*/
4.下面的代码不会报错 /*编译器检查代码是一行一行检查,参数化类型和原始类型可以相互引用*/
Vector v1 = new Vevtor<String>();
Vector<Object> = v1;
注:List<User> users = new ArrayList<User>()
List<User> users = new ArrayList<>()
二者有什么区别 ,除了 编辑器 有警告
/*泛型的通配符及其扩展*/
Collection<?>a 可以与任意参数化的类型匹配,但到底匹配什么类型,编译阶段是不知道的,所以
a = new ArrayList<Integer> 和 a = new ArrayList<String>都可以,这就是通配符 "?" 的作用
另外,由通配符定义的参数化类型,只能调用和类型参数无关的方法,如 /*size()*/ 方法,不能调用如 /*add(E e)*/方法等需要未来才能明确类型的方法
/*通配符的扩展*/
限定通配符的上边界 /*通配符匹配的类型参数要为Number 或为Number的子类*/ 最大为Number
List<? extends Number> list = new ArrayList<Integer>; /**/
限定通配符的下边界 /*通配符匹配的类型参数要为Integer 或为Integer的父类*/ 最小为Integer
List<? super Integer> list = new ArrayList<Number>;
限定通配符总是包括自己
/*自定义泛型方法及应用*/
定义泛型方法
Java中的泛型类型(或者泛型)类似C++中的模板。但是这种相似性仅限于表面,Java语言中的泛型基本上完全是在编译器中实现,用于编译器执行类型检查和类型判断,然后生成普通的非泛型的字节码(擦除)
Java的泛型方法没有C++模板函数功能强大,如:
//add方法最后返回的类型 与 X,Y的类型相关,进行类型推断 (能够包含X类型和Y类型的类型)
private <T> T add(T x , T y) {
//return x+y;//提示,不是所有的类型都可以执行 + 操作; 这个在C++中是可以通过的
return null;
}
另外,1.泛型方法的类型参数,只能是引用类型,不能是基本类型,如:T 不能被 int 等替换
2.定义泛型的时候也可以使用extends限定符
3.也可以用类型变量表示异常,称为参数化的异常,可以用于方法的throw列表中,但不能用于catch,即只能扔,不能抓
/*如果类型有多个方法需要使用泛型,则应该使用类级别的泛型*/
/*通过反射获得泛型的实际类型参数*/(即List<Date>),得到Date
1.反射得到某个方法
Method test3 = Test3.class.getMethod("test4", List.class);
2.得到泛型的类型参数
Type[] gpts = test3.getGenericParameterTypes();
3.用ParameterizedType 表示参数化类型
ParameterizedType pType = (ParameterizedType) gpts[0];
4.pType.getRawType() //得到声明此类型的类或接口。 List
pType.getActualTypeArguments()[0] //得到实际类型参数的 Type 对象的数组 Date 只所以是数组,是因为可能有多个
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基础】泛型的一些总结
什么是泛型 泛型其实可以理解为一种广泛的类型,啥类型都型,当然,这种泛是指定义时可以广泛,但是使用时必须确定类型.也就是说,当不清楚未来使用哪种类型时,定义为泛型.可以支持泛型类,泛型接口,泛型方法, ...
随机推荐
- MYSQL 启动问题
1.日志中出现 [ERROR] InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different si ...
- 第二十二章 集成验证码——《跟我学Shiro》
目录贴:跟我学Shiro目录贴 在做用户登录功能时,很多时候都需要验证码支持,验证码的目的是为了防止机器人模拟真实用户登录而恶意访问,如暴力破解用户密码/恶意评论等.目前也有一些验证码比较简单,通过一 ...
- 简单的api实现以及动态函数调用
实现一个简单的api功能,环境python2.7 请求方法:curl http://ip:8000/?name={api中的方法名}|python -m json.tool 只需编写api的方法即可 ...
- Mac安装7Z以及Mac下查看隐藏文件夹
一:Mac下安装7Z: 1:brew直接安装解压工具 $ brew search 7z 会搜索到: ==> Formulae p7zip 2:$ brew install p7zip ...
- easyui中combobox下拉内容进行分组
需求:对combobox下拉内容进行分组. 效果样式: 代码: valueField:'paymethod_name', textField:'paymethod_name', data:[{ &qu ...
- [学习笔记] Blender 常用工具栏,选择及游标
Shift + A 创建物体 选择工具: 默认是框选 shift 鼠标左键 加选, 再次可减选 游标 默认情况下游标在世界中心.创建新物体时,会自动被创建在游标的位置.可以随意改变游标的位置,便于建模 ...
- ng接口API开发文档
接口版本:v1 接口协议:请商户对接使用对应的转账接口API和免转接口API,商户只能使用菜单对应的API,否则接口会调用失败.左侧菜单未注明的接口免转钱包和转账钱包可以共同使用所有采集均按照北京时间 ...
- Python 用hashlib求中文字符串的MD5值 (转自 haungrui的专栏)
使用过hashlib库的朋友想必都遇到过以下的错误吧:“Unicode-objects must be encoded before hashing”,意思是在进行md5哈希运算前,需要对数据进行编码 ...
- ftp操作命令
原文:https://www.cnblogs.com/tssc/p/9593614.html 1.登陆ftp服务器 ftp [IP] [PORT] # 登陆ftp服务器,本机登陆可以不写IP实例演示: ...
- Greenplum 5.21.1 集群安装部署
简单来说GPDB是一个分布式数据库软件,其可以管理和处理分布在多个不同主机上的海量数据.对于GPDB来说,一个DB实例实际上是由多个独立的PostgreSQL实例组成的,它们分布在不同的物理主机上,协 ...