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泛型的基本使用相关推荐

  1. java 泛型 父子,Java泛型-mb601cf8a78cc07的博客-51CTO博客

    Java泛型 泛型类 即把不确定的数据元素类型用一个泛型占位符表示@Data public class Person { private T name; private T address; }Per ...

  2. Java泛型 通配符? extends与super

    本文来源:https://i.cnblogs.com/EditPosts.aspx?opt=1 感谢博主.本文仅供参考学习. Java 泛型 关键字说明 ? 通配符类型 <? extends T ...

  3. 泛型java博客园,Java深度历险之Java泛型

    Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JD ...

  4. Java学习笔记(二一)——Java 泛型

    [前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...

  5. 聊一聊Java 泛型通配符 T,E,K,V,?

    欢迎关注方志朋的博客,回复"666"获面试宝典 | 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者 ...

  6. 聊一聊Java 泛型中的通配符 T,E,K,V,?

    点击上方"方志朋",选择"设为星标" 回复"1024"获取独家整理的学习资料 作者:glmapper juejin.im/post/5d57 ...

  7. 用了这么多年的 Java 泛型,你对它到底有多了解?|原创

    作为一个 Java 程序员,日常编程早就离不开泛型.泛型自从 JDK1.5 引进之后,真的非常提高生产力.一个简单的泛型 T,寥寥几行代码, 就可以让我们在使用过程中动态替换成任何想要的类型,再也不用 ...

  8. java泛型的逆变_Java泛型的逆变

    在上篇<Java泛型的协变>这篇文章中遗留以下问题--协变不能解决将子类型添加到父类型的泛型列表中.本篇将用逆变来解决这个问题. 实验准备 我们首先增加以下方法,见代码清单1所示. 代码清 ...

  9. Java 泛型 T,E,K,V,?,傻傻分不清?

    前言 ​ Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的 ...

最新文章

  1. 谢文睿:西瓜书 + 南瓜书 吃瓜系列 11. 贝叶斯分类器
  2. Objective-C 入门(七)协议 protocol(JAVA中的接口)
  3. Django 基于角色的权限控制
  4. STDIN_FILENO和stdin区别
  5. Java黑皮书课后题第2章:*2.20(金融应用:计算利息)编写程序,读取余额和年利率百分比,打印下个月的利息
  6. linux对2k屏幕,(转)Linux中的screen命令使用
  7. .net html5页面缓存,详解HTML5中的manifest缓存使用
  8. java ee cdi_Java EE CDI Producer方法教程
  9. 王道考研 计算机网络6 OSI参考模型和各层作用
  10. GCC和TCC编译TCC
  11. SPOJ REPEATS Repeats (后缀数组 + RMQ:子串的最大循环节)题解
  12. Android HAL
  13. 常见脱壳与反编译工具
  14. elasticsearch报错java.lang.IllegalStateException: failed to obtain node locks, tried [[/usr/local/elas
  15. 浅读C Primer Plus——C语起源
  16. 单片机学习笔记-数码管的显示
  17. 预测算法——指数平滑法
  18. 所有weblogic版本下载
  19. javaweb JAVA JSP小型酒吧管理系统jsp酒吧系统jsp酒吧管理系统
  20. 最简单好用的免费录屏软件

热门文章

  1. CV语义分割实践指南!
  2. 论文被拒,项目被砍?斯坦福最惨在读博士教你如何直面失败
  3. NLP入门之路及学习方法:从任务实践入手!
  4. PIP_安装PYTHON包的三种方式
  5. CVPR 2021:记一次神奇的 Rebuttal 经历
  6. 华中科技大学通报:取消张某某研究生导师资格,调离教师岗位,停止其教师资格...
  7. JupyterLab 3.0发布!
  8. 【资源】Faster R-CNN原理及代码讲解电子书
  9. 4岁的儿子还不会写红黑树,我该怎么办?
  10. 五一到底去哪玩?哪个景点人少又好玩?手把手教你玩Python爬虫