JAVA泛型的基本使用
2023-09-11 14:14:59 时间
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泛型的协变》
相关文章
- MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池
- JAVA-数据库之查询记录
- Java面向对象高级--继承的应用----整形数组类、排序类、反转类
- java错误:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Bu
- Java中使用Jedis操作Redis
- Java 容器 & 泛型:五、HashMap 和 TreeMap的自白
- Java实现 LeetCode 809 情感丰富的文字 (暴力)
- Java实现 LeetCode 137 只出现一次的数字 II(二)
- java实现第七届蓝桥杯打靶
- Java实现寻找和为定值的多个数
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- Java邻接表表示加权有向图,附dijkstra最短路径算法
- 【JAVA】 02-Java对象细节
- 【JAVA】java中的length和length()
- 【JAVA】java编译错误:编码UTF8/GBK的不可映射字符
- 当年的java考试:Java景区预约登记管理系统(maven整合servlet)
- 【java】Java教程
- Java //PP2.4 编写一个应用程序,读取两个浮点数,然后打印输出它们的和、差及乘积
- 详解jvm之java类加载机制和类加载器(ClassLoader) 深入理解Java类加载器(ClassLoader) 如何自定义类加载器 深入说明双亲委派 双亲委派模型的破坏者-线程上下文类加载器
- java 接口和抽象类的一个最大的区别
- java通过反射获取私有的构造方法,及反射擦除泛型数据类型约束
- Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释
- Java开发技术之成为高级java工程师必须学习的三个技术
- JAVA--泛型复习
- 【java基础】泛型的限制及其继承规则
- 整数拆分(c++,java)