- Java里面的泛型在实际开发中运用的很多,学过C++的同学一定知道C++的模板,而 Java 中的泛型,一定程度上和它还是挺像的。
-
相信写Java的人,大都有用过List的实现类ArrayList。在Java没有泛型之前,它的内部是一个Object的数组实现的。这也导致一个问题,每次使用里面的元素的时候需要向下转型,而且很明显,如果是Object的话,意味着我们可以丢任何对象进去。自动转型成Object,这样在使用的时候就很容易出问题,不知道里面存的是什么。如:
ArrayList list = new ArrayList(); list.add("string1"); list.add("string2"); String str = (String) list.get(0); list.add(new File("test.txt")); 复制代码
- 然而使用泛型容易,我们就经常使用List的泛型,但是如果我们要写一个泛型的类其实并不那么容易。
1. 最简单的泛型
package io.ilss.advanced.generic; /** * className MyObject * description MyObject * * @author feng * @version 1.0 * @date 2019-01-24 18:32 */ public class MyObject<T> extends BaseData { private T valueOne; private T valueTwo; public MyObject(T valueOne, T valueTwo) { this.valueOne = valueOne; this.valueTwo = valueTwo; } public T getValueOne() { return valueOne; } public void setValueOne(T valueOne) { this.valueOne = valueOne; } public T getValueTwo() { return valueTwo; } public void setValueTwo(T valueTwo) { this.valueTwo = valueTwo; } public static void main(String[] args) { MyObject<String> object = new MyObject<>("String one!", "String two"); System.out.println("value one " + object.valueOne + " value two " + object.valueTwo); } } 复制代码
-
在MyObject中引入一个类型变量T,用尖括号
<>
括起来,放在类名的后面。如上!在定义的时候可以有多个类型的变量,在<>
中以逗号,分隔例如public class MyObject<T, U>{…}
,在类中如果要使用类型 就直接把定义的类型变量看做类名使用即可。
2. 用泛型做一个接口返回类
- 相信写Java的 程序员 都写过Web接口,那我们用泛型来封装一个统一响应返回的类ResponseMsg。
package io.ilss.advanced.generic; /** * className ResponseMsg * description ResponseMsg * * @author feng * @version 1.0 * @date 2019-01-24 18:47 */ public class ResponseMsg<T extends BaseData> { public static int SUCCESS_CODE = 1; public static int ERROR_CODE = 0; public static int OTHER_CODE = -1; private int code; private String msg; private T data; public static <U extends BaseData> ResponseMsg sendSuccess(U data) { ResponseMsg<U> responseMsg = new ResponseMsg<>(); responseMsg.code = SUCCESS_CODE; responseMsg.data = data; responseMsg.msg = "Remote Call Success!"; return responseMsg; } public static <U extends BaseData> ResponseMsg sendError(U data, String msg) { ResponseMsg<U> responseMsg = new ResponseMsg<>(); responseMsg.code = ERROR_CODE; responseMsg.data = data; responseMsg.msg = "Remote Call Error"; return responseMsg; } public static <U extends BaseData> ResponseMsg sendOther(U data, String msg) { ResponseMsg<U> responseMsg = new ResponseMsg<>(); responseMsg.code = OTHER_CODE; responseMsg.data = data; responseMsg.msg = msg; return responseMsg; } public static void main(String[] args) { System.out.println(ResponseMsg.<MyObject>sendSuccess(new MyObject<String>("asdf","asfd"))); } @Override public String toString() { return "ResponseMsg{" + "code=" + code + ", msg='" + msg + '\'' + ", data=" + data + '}'; } } 复制代码
-
上面的重点是上的
<U>
我利用静态方法封装了ResponseMsg
的构建,只需要提供静态方法让调用的人传入一个类,也可以不用写Getter Setter方法,或者直接变成私有方法。 -
方法如果要用泛型,则只需要在定时的时候在返回类型前面加上即可使用。调用的时候直接在调用方法前面用
<>
传入你想用的类即可。如上所示,也可以将方法用的泛型直接传入自己类定义的泛型。 -
此外还可以通过
extends
限定你是某某类的子类,或者实现了某个接口。如果有多个接口可以用&连接,比如<T extends Comparable & Serializable>
,如果有多个泛型可以是这样<T extends OneObject, U extends TwoObject>
3. 注意
-
泛型不能直接
new
,需要外部传入。 如:T data = new T(); //这是不被允许的,不能实例化对象 T[] arr = new T[10]; //这也是不被允许的 不能构造泛型数组 复制代码
关于我
- 坐标杭州,普通本科在读,计算机科学与技术专业,20年毕业,目前处于实习阶段。
- 主要做Java开发,会写点Golang、Shell。对微服务、大数据比较感兴趣,预备做这个方向。
- 目前处于菜鸟阶段,各位大佬轻喷,小弟正在疯狂学习。
- 欢迎大家和我交流鸭!!!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Docker - 入门(一),基础使用
- 一)redis 基础介绍与使用
- Java Properties类使用基础
- golang基础学习-MongoDB使用
- gitlab命令行使用(基础篇)
- 安卓SQLite基础使用指南
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python the Hard Way
Zed Shaw / Example Product Manufacturer / 2011
This is a very beginner book for people who want to learn to code. If you can already code then the book will probably drive you insane. It's intended for people who have no coding chops to build up t......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!
JSON 在线解析
在线 JSON 格式化工具
图片转BASE64编码
在线图片转Base64编码工具