Java泛型解析(01):认识泛型
所以说泛型是Java5以后才有的,欲知详情,继续往下看。
我们来吐槽一下没有泛型的程序是怎么写的。
ArrayList al = new ArrayList();
al.add("ysjian001");
al.add(1);
al.add(new Object());
这段代码看似功能强大。为什么呢?由于它似乎可以往集合加入各种类型的对象(int 类型会被装箱成 Integer对象类型),貌似一些老程序猿也倾向于这么去做,并且他们可以理直气壮的告诉我理由:我这么做想存什么就存什么!先不否定这样的说法,让我们继续,看看以下代码。
// 获取值的时候必须进行强制转换。然后调用相应对象的方法
String first = (String) al.get(0);
往集合里面存值就是为了后期取出来用的。而不是System.out.println(first),这里就产生了一个强制转换的问题,而往往这样的类型的强制转换在编译器是同意通过的,而敲代码的人们会犯下无意间的错误,错误的进行了强制转换,导致程序执行失败。
ArrayList al = new ArrayList();
// 无法进行错误检查,File对象能够加入进去,编译器和执行期都能够通过
al.add(new File());
String first = (String) al.get(0); // 类型转换失败导致执行失败
ArrayList<String> al = new ArrayList<String>();
al.add( "ysjian001");
// al.add(new Thread()); // 定义了String类型參数,加入File对象会报错
String first = al.get(0);// 使用泛型后取值不用进行类型转换
有人会想类型限制我们为什么不直接用数组呢?这个问题就好像问为什么集合优于数组。数组是固定的,而集合是能够自己主动扩展的。
另外在实际中。实现一个泛型事实上并非那么easy。看一个员工和经理继承结构:
public class Employee {
//......
}
public class Manager extends Employee {
// ......
}
ArrayList<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee()); // 能够加入员工
employees.add( new Manager()); // 能够加入经理,由于经理也是员工
ArrayList<Manager> employees = new ArrayList<Manager>();
employees.add(new Manager()); // 加入经理是正常的操作
// employees.add(new Employee()); // 此时不能够加入Employee
那么当把不同的泛型类混合在一起使用时,或者对Java5之前的遗留代码进行衔接时,可能会看到含糊不清的的错误消息。
这样一来。程序猿就须要学习Java泛型来解决这个问题了,而不是在程序中胡乱推測了。终于,部分程序猿可能想要实现自己的泛型类和泛型方法。
public class Couple<T> {
private T wife ;
private T husband ;
public Couple(T wife, T husband) {
this.wife = wife;
this.husband = husband;
}
public void setWife(T wife) {this. wife = wife;}
public void setHusband(T husband) {this. husband = husband;}
public T getWife() {return wife;}
public T getHusband() {return husband;}
}
public class Couple<T, K, V> {......} // 多个类型參数用逗号隔开
private T wife ; // 类型參数定义域
public T getWife() {return wife;}// 类型參数定义方法返回的类型
Couple<Person>(Person,Person);
setWife(Person);
setHusband(Person);
Person getWife();
Person getHusband();
public class GenericMethod {
public static <T> T getFirstValue(T[] values) {
return values[0];
}
}
String[] values = { "JavaSE","CoreJava" ,"EffectiveJava"};
String firstValue = GenericMethod.<String>getFirstValue(values);
String firstValue = GenericMethod.getFirstValue(values);
Java泛型解析(01):认识泛型的更多相关文章
- Java泛型解析(03):虚拟机运行泛型代码
Java泛型解析(03):虚拟机运行泛型代码 Java虚拟机是不存在泛型类型对象的,全部的对象都属于普通类,甚至在泛型实现的早起版本号中,可以将使用泛型的程序编译为在1.0虚拟机上可以执行的 ...
- Java泛型解析(04):约束和局限性
Java泛型解析(04):约束和局限性 前两节.认识和学习了泛型的限定以及通配符.刚開始学习的人可能须要一些时间去体会到泛型程序设计的优点和力量,特别是想成为库程序猿的同学就须要下 ...
- Java泛型解析(02):通配符限定
Java泛型解析(02):通配符限定 考虑一个这种场景.计算数组中的最大元素. [code01] public class ArrayUtil { public static <T&g ...
- Java编程的逻辑 (36) - 泛型 (中) - 解析通配符
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- Java泛型解析
1. 概述 在引入范型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入范型后,一个复杂类型就可以在细分成更多的类型. 例如原先的类型List,现在在细分成List< ...
- Java中泛型的详细解析,深入分析泛型的使用方式
泛型的基本概念 泛型: 参数化类型 参数: 定义方法时有形参 调用方法时传递实参 参数化类型: 将类型由原来的具体的类型参数化,类似方法中的变量参数 类型定义成参数形式, 可以称为类型形参 在使用或者 ...
- 使用GSON和泛型解析约定格式的JSON串(转)
时间紧张,先记一笔,后续优化与完善. 解决的问题: 使用GSON和泛型解析约定格式的JSON串. 背景介绍: 1.使用GSON来进行JSON串与java代码的互相转换. 2.JSON的格式如下三种: ...
- Java 8 新特性之泛型的类型推导
1. 泛型究竟是什么? 在讨论类型推导(type inference)之前,必须回顾一下什么是泛型(Generic).泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据 ...
- 【java基础学习】-【泛型】
参考以下几位同学的总结来学习: http://www.cnblogs.com/lwbqqyumidi/p/3837629.html#!comments http://www.weixueyuan.ne ...
随机推荐
- 后台管理进程GameMaster
初步准备在后台加一个进程,用来控制进程中的各种数据,修改,查看,删除玩家数据类似于后端的gm控制平台
- jQuery四叶草菜单效果,跟360杀毒软件差不多
首先,我们要在js,css文件夹中创建js跟css,然后在body中写入html代码 <main><!--标签是 HTML 5 中的新标签. 素中的内容对于文档来说应当是唯一的.它不 ...
- 项目经验——Sql server 数据库的备份和还原____还原数据库提示“介质集有2个介质簇,但只提供了1个。必须提供所有成员” .
在对数据库备份与还原的过程中,我遇到一个问题“介质集有2个介质簇,但只提供了1个.必须提供所有成员”,下面详细的介绍一下遇到问题的经过与问题解决的方法! 一.备份与还原遇到的问题描述与解决方法: 前两 ...
- Android Studio 入门 Hello World
Android Studio 入门 Hello World Gavin要加油 1.5k 6月22日 发布 推荐 1 推荐 收藏 17 收藏,2.1k 浏览 引言 前两天开始学习android开发,本来 ...
- python学习笔记- 补遗
1.extend 和 append区别 extend 和 append区别 #extend接受list参数,添加每个元素至原list尾端 >>> l=[1,2,3] >> ...
- MySql(四)Select条件查询
select条件查询的格式如下: SELECT 查询列表FROM 表名WHERE 筛选条件:123456根据筛选条件可以分为以下几类: 按照条件按表达式进行筛选 常用条件运算符如下:> .< ...
- [转]SAS盘和SATA盘之间的区别
很多人一提到SAS盘和SATA盘之后,首先想到的是接口方面的区别,SAS的接口速度比SATA高很多,所以认为SAS盘要比SATA盘快,性能高.其实,接口方面的区别并不是主要的,只是很小的一方面.那么, ...
- share——Alpha版(内部测试版)发布
我们产品的下载二维码: 使用说明: 后期会进行更新,文件下载位置
- Bullet:关于ORACLE中的HASH JOIN的参数变化
Oracle在7.3引入了hash join. 但是在Oracle 10g及其以后的Oracle数据库版本中,优化器,实际是CBO,也是因为HASH JOIN仅适用于CBO,在解析目标SQL时是否考虑 ...
- zabbix部署-版本3.2.6
172.18.237.14:一台主机上安装LAMP环境以及zabbix_server.zabbix_agentd 一.安装zibbix-server 1.环境要求 yum install mysql- ...