JAVA泛型的基本使用
Java1.5版本号推出了泛型,尽管这层语法糖给开发者带来了代码复用性方面的提升,可是这只是是编译器所做的一层语法糖,在真正生成的字节码中,这类信息却被擦除了。
笔者发现非常多几年开发经验的程序猿,依旧不善于使用Java泛型,本文将从Java泛型的基本使用入手,在今后的多篇博文里。对泛型的使用做个总结。本文不会深入Java泛型的实现原理。仅仅会介绍Java泛型的使用。
实验准备
首先须要创建一个类继承体系。以商品为例,每种商品都有主要的名称属性。在大数据应用中,数据表和服务都能够作为商品,表有行数属性,服务有方法属性。实现如代码清单1所看到的。
代码清单1
class Auction {private String name;public Auction(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String toString() {return name;}}class Table extends Auction {private Integer rowNum;public Table(String name, Integer rowNum) {super(name);this.rowNum = rowNum;}public Integer getRowNum() {return rowNum;}public void setRowNum(Integer rowNum) {this.rowNum = rowNum;}public String toString() {return super.toString() + ", rowNum :" + rowNum;}}class Service extends Auction {private String method;public Service(String name, String method) {super(name);this.method = method;}public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}public String toString() {return super.toString() + ", method :" + method;}}
实验:泛型最基本使用
如今为了演示泛型的使用,还是以商品为例。数据表本身仅仅是Hbase中的一张表,而服务是执行于Hadoop Yarn之上的一个数据服务,比方说是Strom、Spark或者Oozie。不管是数据表还是服务,它本身并非商品,要成为商品。必须有个装饰器将它包装为商品,如今我们用泛型实现一个简单的装饰器。见代码清单2所看到的。
代码清单2
class Decorator<T> {/*** * 描 述:Exp1使用<br/>* 作 者:jiaan.gja<br/>* 历 史: (版本号) 作者 时间 凝视 <br/>* @param itemList*/public void doDecorate(List<T> itemList) {for(int i = 0; i < itemList.size(); i++) {System.out.println(itemList.get(i));}}/*** * 描 述:Exp1使用<br/>* 作 者:jiaan.gja<br/>* 历 史: (版本号) 作者 时间 凝视 <br/>* @param itemList* @param t*/public void addDecorate(List<T> itemList, T t) {itemList.add(t);}}
如今我们能够使用Decorator给List加入或者打印不论什么类型了,如代码清单3所看到的。
代码清单3
/*** * 类 名: Exp1<br/>* 描 述: 泛型最基本使用<br/>* 作 者: jiaan.gja<br/>* 创 建: 2015年8月13日<br/>** 历 史: (版本号) 作者 时间 凝视*/
class Exp1 {public static void main(String[] args) {Decorator<Auction> decoratorA = new Decorator<Auction>();List<Auction> listA = new ArrayList<Auction>();Auction auctionOne = new Auction("auctionOne");Auction auctionTwo = new Auction("auctionTwo");decoratorA.addDecorate(listA, auctionOne);decoratorA.addDecorate(listA, auctionTwo);decoratorA.doDecorate(listA);Decorator<Table> decoratorB = new Decorator<Table>();List<Table> listB = new ArrayList<Table>();Table tableOne = new Table("tableOne", 10);Table tableTwo = new Table("tableTwo", 20);decoratorB.addDecorate(listB, tableOne);decoratorB.addDecorate(listB, tableTwo);decoratorB.doDecorate(listB);Decorator<Service> decoratorC = new Decorator<Service>();List<Service> listC = new ArrayList<Service>();Service serviceOne = new Service("serviceOne", "methodOne");Service serviceTwo = new Service("serviceTwo", "methodTwo");decoratorC.addDecorate(listC, serviceOne);decoratorC.addDecorate(listC, serviceTwo);decoratorC.doDecorate(listC);}
}
遗留问题
假设想要Auction用于Decorator,必需要声明Decorator<Auction>;Service用于Decorator,也必须声明Decorator<Service>。因为Table是Auction的子类型,我们自然想将Table也能用于Decorator<Auction>。就像以下这样:
decoratorA.doDecorate(listB);
listB的泛型Table的确是decoratorA的泛型Auction的子类型,可是编译器会报错。说明不同意这样的语法。
怎样解决问题?请看下一篇《Java泛型的协变》
JAVA泛型的基本使用相关推荐
- java 泛型 父子,Java泛型-mb601cf8a78cc07的博客-51CTO博客
Java泛型 泛型类 即把不确定的数据元素类型用一个泛型占位符表示@Data public class Person { private T name; private T address; }Per ...
- Java泛型 通配符? extends与super
本文来源:https://i.cnblogs.com/EditPosts.aspx?opt=1 感谢博主.本文仅供参考学习. Java 泛型 关键字说明 ? 通配符类型 <? extends T ...
- 泛型java博客园,Java深度历险之Java泛型
Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JD ...
- Java学习笔记(二一)——Java 泛型
[前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...
- 聊一聊Java 泛型通配符 T,E,K,V,?
欢迎关注方志朋的博客,回复"666"获面试宝典 | 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者 ...
- 聊一聊Java 泛型中的通配符 T,E,K,V,?
点击上方"方志朋",选择"设为星标" 回复"1024"获取独家整理的学习资料 作者:glmapper juejin.im/post/5d57 ...
- 用了这么多年的 Java 泛型,你对它到底有多了解?|原创
作为一个 Java 程序员,日常编程早就离不开泛型.泛型自从 JDK1.5 引进之后,真的非常提高生产力.一个简单的泛型 T,寥寥几行代码, 就可以让我们在使用过程中动态替换成任何想要的类型,再也不用 ...
- java泛型的逆变_Java泛型的逆变
在上篇<Java泛型的协变>这篇文章中遗留以下问题--协变不能解决将子类型添加到父类型的泛型列表中.本篇将用逆变来解决这个问题. 实验准备 我们首先增加以下方法,见代码清单1所示. 代码清 ...
- Java 泛型 T,E,K,V,?,傻傻分不清?
前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的 ...
最新文章
- 谢文睿:西瓜书 + 南瓜书 吃瓜系列 11. 贝叶斯分类器
- Objective-C 入门(七)协议 protocol(JAVA中的接口)
- Django 基于角色的权限控制
- STDIN_FILENO和stdin区别
- Java黑皮书课后题第2章:*2.20(金融应用:计算利息)编写程序,读取余额和年利率百分比,打印下个月的利息
- linux对2k屏幕,(转)Linux中的screen命令使用
- .net html5页面缓存,详解HTML5中的manifest缓存使用
- java ee cdi_Java EE CDI Producer方法教程
- 王道考研 计算机网络6 OSI参考模型和各层作用
- GCC和TCC编译TCC
- SPOJ REPEATS Repeats (后缀数组 + RMQ:子串的最大循环节)题解
- Android HAL
- 常见脱壳与反编译工具
- elasticsearch报错java.lang.IllegalStateException: failed to obtain node locks, tried [[/usr/local/elas
- 浅读C Primer Plus——C语起源
- 单片机学习笔记-数码管的显示
- 预测算法——指数平滑法
- 所有weblogic版本下载
- javaweb JAVA JSP小型酒吧管理系统jsp酒吧系统jsp酒吧管理系统
- 最简单好用的免费录屏软件