博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA泛型的基本使用
阅读量:6313 次
发布时间:2019-06-22

本文共 3902 字,大约阅读时间需要 13 分钟。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/50763741

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
{ /** * * 描 述:Exp1使用
* 作 者:jiaan.gja
* 历 史: (版本) 作者 时间 注释
* @param itemList */ public void doDecorate(List
itemList) { for(int i = 0; i < itemList.size(); i++) { System.out.println(itemList.get(i)); } } /** * * 描 述:Exp1使用
* 作 者:jiaan.gja
* 历 史: (版本) 作者 时间 注释
* @param itemList * @param t */ public void addDecorate(List
itemList, T t) { itemList.add(t); } }

现在我们可以使用Decorator给List添加或者打印任何类型了,如代码清单3所示。

代码清单3

/** *  * 类 名: Exp1
* 描 述: 泛型最基本使用
* 作 者: jiaan.gja
* 创 建: 2015年8月13日
* * 历 史: (版本) 作者 时间 注释 */class Exp1 { public static void main(String[] args) { Decorator
decoratorA = new Decorator
(); List
listA = new ArrayList
(); Auction auctionOne = new Auction("auctionOne"); Auction auctionTwo = new Auction("auctionTwo"); decoratorA.addDecorate(listA, auctionOne); decoratorA.addDecorate(listA, auctionTwo); decoratorA.doDecorate(listA); Decorator
decoratorB = new Decorator
(); List
listB = new ArrayList
decoratorC = new Decorator
(); List
listC = new ArrayList
(); Service serviceOne = new Service("serviceOne", "methodOne"); Service serviceTwo = new Service("serviceTwo", "methodTwo"); decoratorC.addDecorate(listC, serviceOne); decoratorC.addDecorate(listC, serviceTwo); decoratorC.doDecorate(listC); }}
(); Table tableOne = new Table("tableOne", 10); Table tableTwo = new Table("tableTwo", 20); decoratorB.addDecorate(listB, tableOne); decoratorB.addDecorate(listB, tableTwo); decoratorB.doDecorate(listB); Decorator

遗留问题

如果想要Auction用于Decorator,必须要声明Decorator<Auction>;Service用于Decorator,也必须声明Decorator<Service>。由于Table是Auction的子类型,我们自然想将Table也能用于Decorator<Auction>,就像下面这样:

decoratorA.doDecorate(listB);

listB的泛型Table的确是decoratorA的泛型Auction的子类型,但是编译器会报错,说明不允许这种语法。

如何解决这个问题?请看下一篇

你可能感兴趣的文章
rhel6下安装配置Squid过程
查看>>
《树莓派开发实战(第2版)》——1.1 选择树莓派型号
查看>>
在 Linux 下使用 fdisk 扩展分区容量
查看>>
结合AlphaGo算法和大数据的量化基本面分析法探讨
查看>>
如何在 Ubuntu Linux 16.04 LTS 中使用多个连接加速 apt-get/apt
查看>>
《OpenACC并行编程实战》—— 导读
查看>>
机器学习:用初等数学解读逻辑回归
查看>>
如何在 Ubuntu 中管理和使用逻辑卷管理 LVM
查看>>
Oracle原厂老兵:从负面案例看Hint的最佳使用方式
查看>>
把自己Github上的代码添加Cocoapods支持
查看>>
C语言OJ项目参考(2493)四则运算
查看>>
零基础入门深度学习(二):神经网络和反向传播算法
查看>>
find和xargs
查看>>
数据结构例程—— 交换排序之快速排序
查看>>
WKWebView代理方法解析
查看>>
IOS定位服务的应用
查看>>
[SMS&WAP]实例讲解制作OTA短信来自动配置手机WAP书签[附源码]
查看>>
IOS中图片(UIImage)拉伸技巧
查看>>
【工具】系统性能查看工具 dstat
查看>>
基于zepto或jquery的手机端弹出框成功,失败,加载特效
查看>>