摘要:把一个对象放进集合中之后,集合就会忘记这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成类型了为了解决上面的问题,就引出了泛型这一个概念泛型接口和类苹果可以灵活的封装,并且同时有可以限定类型,泛型的接口和类更像是一种通用的模型,
把一个对象放进集合中之后,集合就会忘记这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成Object类型了
为了解决上面的问题,就引出了泛型这一个概念
泛型接口和类public class Fruit{ private T info; public Fruit(T info) { this.info = info; } public T getInfo() { return info; } public void setInfo(T info) { this.info = info; } public static void main(String[] args) { Fruit lt = new Fruit ("苹果"); System.out.println(lt.getInfo()); Fruit intg = new Fruit (1); System.out.println(intg.getInfo()); } }
泛型接口和类的子类可以灵活的封装,并且同时有可以限定类型,泛型的接口和类更像是一种通用的模型,模型内部的类型由使用者自己限定
无论为泛型的类型形参传入哪一种类型的实参,对于Java来说,他们依然被当成同一个类处理,在内存中也只占用一块内存空间,因此在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参
public class Apple extends Fruit{ public Apple(String info) { super(info); } @Override public String getInfo() { return super.getInfo(); } }
使用泛型接口或类的时候,虽然可以不加<>部分,但是推荐加上,不然还要强制类型转换等麻烦操作
重写父类方法或者实现接口的时候,返回值一定要跟父类(接口)一致
设定类型形参的上限public class Fruit{ private T info; public Fruit(T info) { this.info = info; } public T getInfo() { return info; } public void setInfo(T info) { this.info = info; } public static void main(String[] args) { Fruit lt = new Fruit<>("苹果"); System.out.println(lt.getInfo()); Fruit> intg = new Fruit<>("1"); System.out.println(intg.getInfo()); } }
可以有多个限定条件,存在多个限定条件的时候,使用&连接
至多一个父类上限,多个接口上限
接口上限要在类上线后面
类型通配符使用类型通配符的类是各种该类的泛型的父类
public class Fruit{ private T info; public Fruit(T info) { this.info = info; } public T getInfo() { return info; } public void setInfo(T info) { this.info = info; } public static void main(String[] args) { Fruit lt = new Fruit<>("苹果"); System.out.println(lt.getInfo()); Fruit> intg = new Fruit<>(1); System.out.println(intg.getInfo()); } }
在Java 7以后可以使用菱形语法,在构造器后不需要完整的泛型信息
"?"用于操作具体的某个泛型类的时候,还未确定最终使用时,采用的对象类型,就用问号作为占位的含义
通配符的上限设定Fruit extends String> intg = new Fruit<>("1");
使用extends的方式限定?必须是String类型或者是其子类类型
通配符的下限设定staticvoid getCollection(Fruit super T>b){ System.out.println(b); }
一定要是T或者T的父类
泛型方法修饰符返回值类型 方法名(形参列表){ 方法体 }
staticvoid getCollection(B[]b,Collection c){ }
多个类型形参之间用逗号分隔
所有类型形参声明放在修饰符和方法返回类型之间
方法中定义的类型形参只能在该方法里使用,而接口或类中定义的类型形参可以在整个接口、类中使用
方法中的泛型参数无需显式传入实际类型参数
public class Fruit{ private T info; public Fruit(T info) { this.info = info; } static void getCollection(B[]b){ System.out.println(b); } public T getInfo() { return info; } public void setInfo(T info) { this.info = info; } public static void main(String[] args) { Fruit.getCollection(new String[]{"1"}); } }
存在泛型构造器,不能使用”菱形“语法
public泛型方法与类型通配符的区别Fruit(T info) { System.out.println(info); }
泛型方法允许类型形参被用来表示方法的一个或多个参数之间的类型依赖关系,或者方法返回值与参数之间的类型依赖关系,如果没有这样的类型依赖关系,就不应该使用泛型方法
类型通配符既可以在方法签名中定义形参的类型,也可以用于定义变量类型,但泛型方法中的类型形参必须在对应方法中显式声明
擦除和转换擦除
当把一个具有泛型信息的对象赋值给另一个没有泛型信息的变量时,尖括号中的泛型信息就会被擦除扔掉
转换
当把一个没有泛型信息的对象赋值给另一个泛型信息的变量时,不会发生报错,会自动转换
更多内容可以关注微信公众号,或者访问AppZone网站
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65988.html
摘要:进阶多线程开发关键技术后端掘金原创文章,转载请务必将下面这段话置于文章开头处保留超链接。关于中间件入门教程后端掘金前言中间件 Java 开发人员最常犯的 10 个错误 - 后端 - 掘金一 、把数组转成ArrayList 为了将数组转换为ArrayList,开发者经常... Java 9 中的 9 个新特性 - 后端 - 掘金Java 8 发布三年多之后,即将快到2017年7月下一个版...
摘要:然而,与普遍印象相反的是,某些情况下在运行时获取到泛型类型信息也是可行的。于是,编译器可以把这部分泛型信息父类的泛型参数是,存储在它的子类的字节码区域中。当使用反射取出中的类型参数时,就必须把这点纳入考量。获取嵌套类的泛型的代码如下 在JDK5引入了泛型特性之后,她迅速地成为Java编程中不可或缺的元素。然而,就跟泛型乍一看似乎非常容易一样,许多开发者也非常容易就迷失在这项特性里。多数...
阅读 911·2021-11-24 09:39
阅读 3300·2021-10-27 14:20
阅读 2285·2019-08-30 14:08
阅读 3312·2019-08-29 16:34
阅读 2135·2019-08-26 12:14
阅读 2075·2019-08-26 11:54
阅读 2744·2019-08-26 11:44
阅读 2443·2019-08-26 11:38