关于泛型通配符与泛型限定
来源:互联网 发布:淘宝商家开通花呗要求 编辑:程序博客网 时间:2024/05/27 06:53
Java中泛型是在不确定具体使用哪个类型的时候进行的泛型处理,这样可以匹配多个数据类型。
而通配符 ? 是一种泛型的手段,通过一个占位符,将所需要的数据类型,不显示的说明,只是在那里模糊的占位,表示有那么一个类型。这样在我们使用泛型时,不管是定义函数还是类,都可以轻松的使用泛型。
泛型的限定:在于将泛型的通配符的作用域减小,本来泛型的通配符的作用域作用于所有的类型,但是有了限定可以将作用域大大减小,方便我们的功能实现。
具体可以分为,向上,向下
向上:
? extends E: 可以接收E 类型或者是E类型的子类型
向下:
? super E 可以接收 E类型 或者是E类型的父类型
下面使用一段代码来进行说明和比较,这样比较直观,可以更好的看出他们的区别:
package mypack;/** * 泛型限定: * ? 通配符 :也可以理解为占位符 * 泛型的限定: * ? extends E: 可以接收E 类型或者是E类型的子类型 * ? super E 可以接收 E类型 或者是E类型的父类型 */import java.util.ArrayList;import java.util.Iterator;public class Fanxingxiand {public static void main(String[] args) {ArrayList<Persons> persons = new ArrayList<Persons>();persons.add(new Persons("aaa"));persons.add(new Persons("bbb"));persons.add(new Persons("ccc"));//打印父类print1(persons);print2(persons);print3(persons);ArrayList<Student> students = new ArrayList<Student>();students.add(new Student("111"));students.add(new Student("333"));students.add(new Student("222"));//打印子类//print(students); 是错误的,print函数是父类的,比较大,子类不能使用print1(students);print2(students);print3(students);//打印无关类ArrayList<Dogs> dogs = new ArrayList<Dogs>();dogs.add(new Dogs("dog1"));dogs.add(new Dogs("dog2"));dogs.add(new Dogs("dog3"));dogs.add(new Dogs("dog4"));print1(dogs); //可以打印//print2(dogs); //编译出错不能打印//print3(dogs); //编译出错不能打印}/*第一种 : 只能打印父类的、public static void print(ArrayList<Persons> persons){Iterator<Persons> it = persons.iterator();while(it.hasNext()){System.out.println(it.next().getName());}}*//*第二种,打印所有 * 可以都讲他们打印出来,但是这个是将什么类型的元素都可以打印出来 * */public static void print1(ArrayList<?> persons){Iterator<?> it = persons.iterator();while(it.hasNext()){System.out.println(it.next().toString());}}/* * 3 。 泛型限定,作用是可以只能打印 Persons 和其子类的的数据 ,其他不能打印。 * */public static void print2(ArrayList<? extends Persons> persons){Iterator<? extends Persons> it = persons.iterator();while(it.hasNext()){System.out.println(it.next().toString());}}public static void print3(ArrayList<? super Student> persons){Iterator<? super Student> it = persons.iterator();while(it.hasNext()){System.out.println(it.next().toString());}}}class Persons {private String name;Persons(){}Persons(String name){this.name = name;}public String getName(){return name;}@Overridepublic String toString() {return "Persons [name=" + name + "]";}}class Student extends Persons{Student(){}Student(String name){super(name);}}class Dogs{private String name;Dogs(){}Dogs(String name){this.name = name;}public String getName(){return name;}@Overridepublic String toString() {return "Dogs [name=" + name + "]";}}
阅读全文
0 0
- 关于泛型通配符与泛型限定
- 通配符,泛型的限定
- 泛型类型限定和通配符类型限定
- Java泛型解析(02):通配符限定
- Java基础 通配符?+泛型限定
- Java泛型通配符以及限定
- 泛型类、泛型方法、通配符泛型、通配符的超类型限定
- java泛型程序设计——通配符类型+通配符的超类型限定
- java 之 泛型的通配符 和 泛型的限定
- 泛型与通配符详解
- 泛型与通配符详解
- 黑马程序员--Java基础加强--06.【泛型通配符限定】【个人总结】
- java 泛型之 通配符的限定 之 extends 的实例
- java 泛型之 通配符的限定 之 super 的实例
- JAVA 泛型限定
- 泛型限定
- 泛型限定
- 泛型限定
- ambari自定义服务(二)metainfo.xml说明
- 【转载】激活 IDEA破解 2017 IDEA license server
- 第一篇:UML用例建模解析(一)
- 针对于数据库分区的使用
- 大数据和云计算究竟有什么关系?
- 关于泛型通配符与泛型限定
- git安装
- Java程序员面试,基础真的很重要
- html5封装成安卓https就显示空白的解决
- mysql 查询a表的某字段 大于 b表中a.id=b.id的条目数
- TTL电平与CMOS电平
- 学好小学奥数必懂的解题思路 建议家长帮孩子收藏
- HDU 1452 Happy 2004
- ambari自定义服务(三)服务配置