摘要:在类上定义的泛型,在类的方法中也可以使用把泛型定义在类上类型变量定义在类上方法中也可以使用用户想要使用哪种类型,就在创建的时候指定类型。使用的时候,该类就会自动转换成用户想要使用的类型了。
一、什么是泛型?
Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.
泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
参数化类型:
ArrayList中的E称为类型参数变量 ArrayList
中的Integer称为实际类型参数 整个称为ArrayList
泛型类型 整个ArrayList
称为参数化的类型ParameterizedType
二、为什么需要泛型
有了泛型以后:
代码更加简洁【不用强制转换】
程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】
可读性和稳定性【在编写集合的时候,就限定了类型】
在创建集合的时候,我们明确了集合的类型了,所以我们可以使用增强for来遍历集合!
//创建集合对象 ArrayListlist = new ArrayList<>(); list.add("hello"); list.add("world"); list.add("java"); //遍历,由于明确了类型.我们可以增强for for (String s : list) { System.out.println(s); }
三、泛型基础
泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来….这样的话,用户明确了什么类型,该类就代表着什么类型…用户在使用的时候就不用担心强转的问题,运行时转换异常的问题了。
在类上定义的泛型,在类的方法中也可以使用!
/* 1:把泛型定义在类上 2:类型变量定义在类上,方法中也可以使用 */ public class ObjectTool{ private T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } }
用户想要使用哪种类型,就在创建的时候指定类型。使用的时候,该类就会自动转换成用户想要使用的类型了。
public static void main(String[] args) {
//创建对象并指定元素类型 ObjectTooltool = new ObjectTool<>(); tool.setObj(new String("钟福成")); String s = tool.getObj(); System.out.println(s); //创建对象并指定元素类型 ObjectTool objectTool = new ObjectTool<>(); /** * 如果我在这个对象里传入的是String类型的,它在编译时期就通过不了了. */ objectTool.setObj(10); int i = objectTool.getObj(); System.out.println(i);
}
定义泛型方法….泛型是先定义后使用的
//定义泛型方法.. publicvoid show(T t) { System.out.println(t); }
用户传递进来的是什么类型,返回值就是什么类型了
public static void main(String[] args) { //创建对象 ObjectTool tool = new ObjectTool(); //调用方法,传入的参数是什么类型,返回值就是什么类型 tool.show("hello"); tool.show(12); tool.show(12.5); }
子类明确泛型类的类型参数变量
/* 把泛型定义在接口上 */ public interface Inter{ public abstract void show(T t); }
实现泛型接口的类…..
/** * 子类明确泛型类的类型参数变量: */ public class InterImpl implements Inter{ @Override public void show(String s) { System.out.println(s); } }
四、泛型的应用
当我们写网页的时候,常常会有多个DAO,我们要写每次都要写好几个DAO,这样会有点麻烦。
public abstract class BaseDao{ //模拟hibernate.... private Session session; private Class clazz; //哪个子类调的这个方法,得到的class就是子类处理的类型(非常重要) public BaseDao(){ Class clazz = this.getClass(); //拿到的是子类 ParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass(); //BaseDao clazz = (Class) pt.getActualTypeArguments()[0]; System.out.println(clazz); } public void add(T t){ session.save(t); } public T find(String id){ return (T) session.get(clazz, id); } public void update(T t){ session.update(t); } public void delete(String id){ T t = (T) session.get(clazz, id); session.delete(t); } }
继承抽象DAO,该实现类就有对应的增删改查的方法了。
public class CategoryDao extends BaseDao{ } BookDao public class BookDao extends BaseDao { }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71746.html
摘要:泛型类型对象之间没有关系,就算之间互为父子关系,也没有任何关系。泛型类的静态上下文中类型变量无效。不能捕获或抛出泛型类的实例。 前言 作为一块后端没有太多经验的年糕,下周要考试了,所以我必须得来好好复习一下我的JAVA进阶课/(ㄒoㄒ)/~~。这个学期主要是学了: 泛型 反射 线程 JDBC JAVA WEB基础 Servlet session&cookie 过滤器&监听器 泛型 ...
摘要:泛型方法可以定义在普通类和泛型类中,泛型方法可以被修饰符修饰。泛型类型变量会在编译后被擦除,用第一个限定类型替换没有限定类型的用替换。比如通配符类型代表任何泛型类型的类型变量是和的子类。这个类型参数有一个子类型限定,其自身又是一个泛型类型。 我的博客 转载请注明原创出处。 序 之所以会想来写泛型相关的内容,是因为看到这样的一段代码: showImg(https://segment...
摘要:进阶多线程开发关键技术后端掘金原创文章,转载请务必将下面这段话置于文章开头处保留超链接。关于中间件入门教程后端掘金前言中间件 Java 开发人员最常犯的 10 个错误 - 后端 - 掘金一 、把数组转成ArrayList 为了将数组转换为ArrayList,开发者经常... Java 9 中的 9 个新特性 - 后端 - 掘金Java 8 发布三年多之后,即将快到2017年7月下一个版...
阅读 1459·2021-09-24 10:38
阅读 1450·2021-09-22 15:15
阅读 3037·2021-09-09 09:33
阅读 878·2019-08-30 11:08
阅读 619·2019-08-30 10:52
阅读 1237·2019-08-30 10:52
阅读 2294·2019-08-28 18:01
阅读 500·2019-08-28 17:55