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泛型会有当前的缺陷? 之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗? 事实上,在Java1.5在200 ...

  2. 浅析Java 泛型

    泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...

  3. Java:泛型基础

    泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...

  4. java泛型基础

    泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类.接口和方法的创建中, 分别称为泛型类.泛型接口.泛型方法.  Ja ...

  5. 使用java泛型设计通用方法

    泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 因此我们可以利用泛型和反射来设计一些通用方法. 现在有2张表, 一张user表和一张stu ...

  6. 关于Java泛型的使用

    在目前我遇到的java项目中,泛型应用的最多的就属集合了.当要从数据库取出多个对象或者说是多条记录时,往往都要使用集合,那么为什么这么使用,或者使用时有什么要注意的地方,请关注以下内容. 感谢Wind ...

  7. 初识java泛型

    1 协变数组类型(covariant array type) 数组的协变性: if A IS-A B then A[] IS-A B[] 也就是说,java中的数组兼容,一个类型的数组兼容他的子类类型 ...

  8. 【Java心得总结四】Java泛型下——万恶的擦除

    一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...

  9. 【Java心得总结三】Java泛型上——初识泛型

    一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...

  10. 初识Java泛型以及桥接方法

    泛型的由来 在编写程序时,可能会有这样的需求:容器类,比如java中常见的list等.为了使容器可以保存多种类型的数据,需要编写多种容器类,每一个容器类中规定好了可以操作的数据类型.此时可能会有Int ...

随机推荐

  1. .Net上传图片压缩质量,不改变尺寸

    图片上传有很多情况需要考虑,例如:生成缩略图.压缩尺寸.压缩质量.压缩尺寸质量.添加水印等等常见情况.最近遇到图片质量压缩不改变大小的问题,参考:听浪 #region 图片压缩 /// <sum ...

  2. 用MVC5+EF6+WebApi 做一个小功能(三) 项目搭建

    一般一个项目开始之前都会有启动会,需求交底等等,其中会有一个环节,大讲特讲项目的意义,然后取一个高大上的项目名字,咱这是一个小功能谈不上项目,但是名字不能太小气了.好吧,就叫Trump吧.没有任何含义 ...

  3. Proxy account failing to run SSIS Error (Proxy (11) is not allowed for subsystem "SSIS" and user "AB\testuser ".

    USE [msdb]EXEC msdb.dbo.sp_grant_login_to_proxy @proxy_name=N'SSISProxyAgentV1', @login_name=N'WTC\E ...

  4. android frame的学习

    http://blog.csdn.net/littletigerat/article/details/6318365   //2011年Android Activity生命周期学习笔记 http:// ...

  5. 内置函数enumerate()使用

    描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. Python 2.3. 以上版本可用,2. ...

  6. 【OCP-12c】CUUG 071题库考试原题及答案解析(16)

    16.(7-5) choose the best answerThe PRODUCTS table has the following structure:Evaluate the following ...

  7. soapui加载天气预报接口报错Characters larger than 4 bytes are not supported: byte 0xb1 implies a length of more than 4 byte的解决办法

    soapui加载天气预报接口时报错如下: Error loading [http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl ...

  8. ElasticSearch关联查找

    ElasticSearch是一个基于Lucene的开源搜索引擎,支持全文检索,提供restful接口.在ES中,提供了类似于MongoDB的面向文档存储服务,这种面向文档的存储非常灵活,但是文档与文档 ...

  9. Python中 '==' 与'is' 以及它们背后的故事

    摘要 比较判断逻辑是在代码中经常使用的,在Python中常用 '==' 和 is 来做比较判断. ==  :  双等号是用来比较变量所指向内存单元中的值是否相等,它只关心值,并不在意值的内存地址,也就 ...

  10. 关于Hibernate的一个简单小程序

    本人根据视频学习了一下三大框架中比较简单的一个Hibernate,并简单完成了一个运用Hibernate的小程序 Hibernate是一个简化web程序Dao层的一个框架,应用他,可以完全脱离sql语 ...