泛型(Generic)
为什么要有泛型?
1.解决元素存储的安全性问题
2.解决获取数据元素时,需要类型强转的问题
服用前:
服用后:
泛型,JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。
使用泛型
泛型的声明
interface List<T>和class TestGen<K,V>
其中,T,K,V不代表值,而是表示类型。这里使用任意字母都可以。常用T表示,是Type的缩写。
泛型的实例化:
一定要在类名后面指定类型参数的值(类型)。如:
List<String> StrList = new ArrayList<String>();
iterator<Customer> iterator = customers.iterator();
T只能是类,不能用基本数据类型填充。
泛型的几个重要使用
1.在集合中使用泛型
2.自定义泛型类
3.泛型方法
4.泛型接口
对于泛型类
1.对象实例化时不指定泛型,默认为:Object
2.泛型不同的引用不能相互赋值。
3.加入集合中的对象类型必须与指定的泛型类型一致。
4.静态方法中不能使用类的泛型。
5.如果泛型类是一个接口或抽象类,则不可创建泛型类的对象。
6.不能在catch中使用泛型
7.从泛型类派生子类,泛型类型需具体化
自定义泛型类
1 class Person<T>{ 2 //使用T类型定义变量 3 private T info; 4 //使用T类型定义一般方法 5 public T getInfo(){ 6 return info; 7 } 8 public void setInfo(T info){ 9 this.info=info; 10 } 11 //使用T类型定义构造器 12 public Person(){} 13 public Person(T info){ 14 this.info=info; 15 } 16 //static的方法中不能声明泛型 17 // public static void show(T t){ 18 // 19 // } 20 //try{} 21 //catch(T t){} 22 }
对于泛型方法
方法,也可以被泛型化,不管此时定义在其中的类是不是泛型化的。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。
泛型方法的格式:
[访问权限]<泛型>返回类型 方法名([泛型标识 参数名称])抛出的异常
public class DAO{
public<E> E get(int id,E e){
E result = null;
return result;
}
}
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
for (T o : a) {
c.add(o);
} }
public static void main(String[] args) {
Object[] ao = new Object[100];
Collection<Object> co = new ArrayList<Object>();
fromArrayToCollection(ao, co);
String[] sa = new String[20];
Collection<String> cs = new ArrayList<>();
fromArrayToCollection(sa, cs);
Collection<Double> cd = new ArrayList<>();
// 下面代码中T是Double类,但sa是String类型,编译错误。
// fromArrayToCollection(sa, cd);
// 下面代码中T是Object类型,sa是String类型,可以赋值成功。
fromArrayToCollection(sa, co); }
泛型和继承的关系
如果B是A的一个子类型(子类或者子接口),而G是具有有泛型声明的类或接口,G<B>并不是G<A>的子类型!
比如:String是Object的子类,单List<String>并不是List<Object>的子类
通配符
1.使用类型通配符:?
比如:List<?>,Map<?,?>
List<?>是List<String>、List<Object>等各种泛型List的父类。
2.读取List<?>的对象list中的元素时,永远是安全的,因为不管list的真实类型是什么,它包含的都是Object。
3.写入list中的元素时,不行。因为我们不知道c的元素类型,我们不能向其中添加对象。
唯一的例外是null,它是所有类型的成员。
将任意元素加入到其中不是类型安全的:
Collection<?> c=new ArrayList<String>();
c.add(new Object());//编译时错误
因为我们不知道c的元素类型,我们不能向其中添加对象
add方法有类型参数E作为集合的元素类型。我们传给add的任何参数都必须是一个未知类型的子类。因为我们不知道那是声明类型,所以我们无法传递任何东西进去。
唯一的例外是null,它是所有类型的成员。
另一方面,我们可以调用get()方法并使用其返回值。返回值是一个未知的类型,但是我们知道,它总是一个Object
有限制的通配符
<?>
允许所有泛型的引用调用
举例:
<? extends Number> (无穷小 , Number]
只允许泛型为Number及Number子类的引用调用
<? super Number> [Number , 无穷大)
只允许泛型为Number及Number父类的引用调用
<? extends Comparable>
只允许泛型为实现Comparable接口的实现类的引用调用
转载于:https://www.cnblogs.com/liangxiaoyu/p/5137614.html
泛型(Generic)相关推荐
- 泛型方法的定义和使用_泛型( Generic )
泛型(Generic) 1. 泛型概述 泛型是一个未知的, 不确定的数据类型. 比如ArrayList 中的E, 就是一个未知的不确定的数据类型, 那么他就是一个泛型 泛型虽然是一个未知的, 不确定的 ...
- 你真的了解泛型 Generic 嘛?
泛型 Generic Programming[1] 通常指允许程序员在强类型程序设计语言中,编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型,即类型参数化 首先我们不是科班讨论学术, ...
- Java - 泛型 ( Generic )
Java - 泛型 ( Generic ) > 泛型的特点 > 解决元素存储的安全性问题 > 解决获取数据元素时,需要类型强转的问题 > 不能在 static 方法中使用泛型, ...
- DotNET:LINQ对泛型(Generic)操作和泛型方法及属性
ylbtech-DotNET:泛型(Generic)和LINQ操作 1,遍历泛型集合 2,根据索引位置移除项(RemoveAt()) 3,查询一个人(Single()) 3.2,查询一个人(Singl ...
- 泛型(generic)概述和基本使用
泛型(generic)概述和基本使用 A:泛型概述 集合边上有一个尖括号,尖括号指的就是泛型. 限定集合存储的数据类型,如果加上这个引用数据类型, 就告诉你这个集合只能存储该类型对象和该类型的子类对象 ...
- java泛型(Generic)超详细
目录 1.为什么要有泛型(Generic)? 2.泛型的设计背景 2.1那么为什么要有泛型呢,直接Object不是也可以存储数据吗? 3.在集合中使用泛型 4.自定义泛型结构 4.1自定义泛型结构:泛 ...
- Java泛型(1)--集合使用泛型Generic、自定义泛型、泛型在继承上的体现、通配符的使用
文章目录 泛型的概念 集合中使用泛型 自定义泛型结构 泛型在继承上的体现 通配符的使用 泛型的概念 集合容器类在设计阶段/声明阶段不能确定这个容器实际存的是什么类型的对象,所以在JDK1.5之前只能把 ...
- Java程序低手之关于泛型(Generic)
虽然一直以来,Java都提供了强制类型转换,但是那确实是Java的弱点,因为你是在取数据的时候才保证了类型安全(Type-safe),而不是在存储数据的时候就做好这项工作,Java5提供了Generi ...
- Java学习打卡第七天——[再谈Collection之Set,TreeSet,泛型Generic的简介和使用]
说明:为了文章的简洁性和方便阅读在以后的打卡过程中,我会给出核心代码 Javaee之[Collection之Set] Javaee之[Collection之TreeSet] Javaee之[Colle ...
- 泛型(Generic)-反射泛形-Dao
JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出). 注意:泛型是提供给j ...
最新文章
- 2014年02月16日
- 对象引用未保存的瞬态实例-在刷新之前保存瞬态实例
- 怎么把pdf文件转换成可编辑的word文档
- 数据结构-顺序查找的二分查找法(折半查找)
- 利用ServiceLocator模式改进JNDI实践
- Java Long类的valueOf()方法及示例
- Java多线程(七)——线程中断
- 一步一步手写实现实时监测物体YOLO v3 EASY METHOD | OpenCV Python CNN卷积神经网络
- DID 去中心化数字身份
- 苹果系统备份文件服务器地址,苹果备份文件在哪里能找到?默认路径在这儿(不知道的进来看看)...
- 读书笔记——阿里数据中台(第一篇:数据中台顶层设计)
- lua 随机数 math.random()和math.randomseed()用法
- iPadmini能运行c语言吗,一个移动固态硬盘,可以给iPad Pro2020和iPad Mini用是什么体验?...
- 基于Openfire Smack开发即时通讯应用、搭建Openfire服务器(一)
- 鸿蒙os多设备如何实现,鸿蒙OS中如何实现跨设备迁移?
- 静听网+python爬虫+多线程+多进程+构建IP代理池
- E5 2670 V1 C1 C2版本区别
- 手机屏幕 and 分辨率
- EXCEL中将数字日期格式改为日期格式
- net.sf.json