java 泛型 窜讲
一、为什么使用泛型
复用性:泛型的本质就是参数化类型,因而使用编写的泛型代码可以被许多不同类型的对象所复用。
安全性:在对类型Object引用的参数操作时,往往需要进行显式的强制类型转换。这种强制类型转换需要在运行时才能被发现是否转换异常,通过引入泛型能将在运行时才能检查类型转换,提前到编译时期就能检查。
二、自定义泛型
java中自定义泛型分为三种:泛型类、泛型接口、泛型方法。
下面使用一个案例演示泛型类、泛型方法,泛型接口类似,所以不再演示。
// 自定义泛型类
public class Generic<T>
{
private T second;
public void setSecond(T newValue)
{
second = newValue;
}
// 自定义泛型方法
public static <W> void printValue(W obj)
{
System.out.println(obj.toString());
}
@Override
public String toString()
{
return second.toString();
}
public static void main(String[] args)
{
//
Generic<String> g = new Generic<String>();
g.setSecond("zhang");
System.out.println(g);
// 使用泛型方法
Generic.printValue(45);
Generic.printValue("hello");
}
}
泛型方法可以在普遍类中定义,也可以在泛型类中定义。
三、java泛型的特性
1、擦除
public static void main(String[] args)
{
ArrayList<String> arrayList1=new ArrayList<String>();
arrayList1.add("abc");
ArrayList<Double> arrayList2=new ArrayList<Double>();
arrayList2.add(666.666);
System.out.println(arrayList1.getClass()==arrayList2.getClass());
}
true
2、补偿
public static void main(String[] args)
{
ArrayList<String> arrayList1=new ArrayList<String>();
arrayList1.add("abc");
String str = arrayList1.get(0); // 编译正常
int str2 = arrayList1.get(0); // 编译报错
}
四、java泛型的约束
五、通配符类型
1、限定上界通配符
public static void main(String[] args)
{
List<? extends Animate> animates = new ArrayList<Animate>(); // OK
List<? extends Animate> animates1 = new ArrayList<Cat>(); // OK
List<Animate> animates2 = new ArrayList<Animate>(); // OK
List<Animate> animates3 = new ArrayList<Cat>(); // compile-time error
}
- G<? extends Y> 是 G<? extends X>的子类型(如List<? extends Cat> 是 List<? extends Animal>的子类型)。
- G<X> 是 G<? extends X>的子类型(如List<Animal> 是 List<? extends Animal>的子类型)
- G<?> 与 G<? extends Object>等同,如List<?> 与List<? extends Objext>等同
学到这里,可能会遇到一些疑惑的地方,或者说事理解不透的地方,先观察如下两段代码片段,判断一下其是否可行??
List<? extends Animal> animal = new ArrayList<>();
animal.add(new Animal());
animal.add(new Cat());
上面的两个add操作都不能通过编译。为什么呢?由于List:add(E e)加入泛型变成List<? extends Animal>:add(? extends Animal e),? extends Animal参数类型无法确定,可以是Animal、Cat等,所以为了保护其类型的一致性,因此不允许向list对象中添加任意对象,除了null。
2、限定下界通配符
List<? super Animate> animates = new ArrayList<>();
animates.add(new Animate());
animates.add(new Cat());
3、无限定通配符
1、Java 泛型通配符?解惑
java 泛型 窜讲的更多相关文章
- 第11讲-Java泛型和文件操作
		1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1.泛型 1.2.2.文件操作 2.具体内容 2.1.Java泛型 2.1.1.为什么需要泛型 我们发现在List中,底层是Object[ ]数 ... 
- 初识java泛型
		1 协变数组类型(covariant array type) 数组的协变性: if A IS-A B then A[] IS-A B[] 也就是说,java中的数组兼容,一个类型的数组兼容他的子类类型 ... 
- Java泛型学习笔记 - (七)浅析泛型中通配符的使用
		一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ... 
- Java泛型-类型擦除
		一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ... 
- Java 泛型,了解这些就够用了。
		此文目录: Java泛型是什么? 通常的泛型的写法示例 类型擦除 为什么要使用Java泛型 通过示例了解PECS原则 一.Java泛型是什么? 官方定义 泛型是Java SE 1.5的新特性,泛型的本 ... 
- Java泛型总结
		1. 什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ... 
- Java泛型:类型擦除
		类型擦除 代码片段一 Class c1 = new ArrayList<Integer>().getClass(); Class c2 = new ArrayList<String& ... 
- 转:有关Java泛型的类型擦除(type erasing)
		转载自:拈花微笑 自从Java 5引入泛型之后,Java与C++对于泛型不同的实现的优劣便一直是饭后的谈资.在我之前的很多training中,当讲到Java泛型时总是会和C++的实现比较,一般得出的结 ... 
- JAVA泛型那些事儿
		本篇内容源于本人一个好友sgpro提供的java学习例子,现拿出来给大家分享. 此例子非常直观的通过代码讲解了java泛型的用法和好处,是笔者一直珍藏的最好的泛型学习笔记. 一.面向过程的时代 我们先 ... 
随机推荐
- VMware 虚拟机安装 Mac OS X Mountain Lion 苹果系统
			国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ... 
- <转>使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机
			准备 今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2 ... 
- 把sublime添加到右键菜单(转)
			sublime text是前端利器,为了方便,我们把它加入到win7系统的右键菜单(xp不支持) 保存为bat文件,放入sublimetext安装文件夹与sublime_text同级,双击执行即可. ... 
- Android手机监控软件设计实现
			一.需求分析: 随着IT信息技术的飞速发展,手机的普及,伴随着智能手机的出现及快速的更新换代,手机已不仅仅是一个通信工具,更是一个多功能的应用平台. 手机监控软件则是基于电脑监控软件的原理,植入手机平 ... 
- 启动android程序和虚拟机时候出现如下错误的解决方法
			启动android程序和虚拟机时候出现如下错误的解决方法. 错误重现: [2011-07-13 16:22:48 - Emulator] invalid command-line parameter: ... 
- struts2 CRUD 入门 配置
			本文介绍struts2在eclipse下的配置,实现一个具有CRUD功能的图书管理系统. 1 开发环境配置 1.1 在Eclipse中配置Struts2 1.1.1 ... 
- 对JavaScript对象数组按指定属性和排序方向进行排序
			引子 在以数据为中心的信息系统中,以表格形式展示数据是在常见不过的方式了.对数据进行排序是必不可少的功能.排序可以分为按单个字段排序和按多个字段不同排序方向排序.单字段排序局限性较大,不能满足用户对数 ... 
- c++与c不太相同的一些地方1
			1.c++区别与java的一个地方:C++更多的是一种规范,不同时期的不同标准,提供了不同的语法要求.所以各个厂商在对C++的支持上也做得不尽相同,比如有些语法vs就支持gcc 就支持的差一些,而某些 ... 
- linux 软件安装各种方法
			一 简单介绍 1.软件安装卸载,分几种情况: A:RPM包 这种软件包就像windows的EXE安装文件一样,各种文件已经编译好,并打了包,哪个文件该放到哪个文件夹,都指定好了,安装非常方便,在图 ... 
- 用expect做自动应答脚本
			Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools).使用它系统管理员可以创 ... 
