? 通配符,也可以理解为占位符
泛型的限定:
? Extends E:可以接受E类型或者E的子类型,上限定
? Super E:可以接受E类型或者E的父类型
?与泛型T在使用上的区别
相关代码
package com.javaxl; import java.util.*; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-05-14 7:04 */ public class GenericDemo2 { public static void main(String[] args) { // method_1(args); // method_2(args); method_3(args); } /** * ?占位符的出现 * @param args */ public static void method_1(String[] args) { ArrayList<String> al = new ArrayList<>(); al.add("java01"); al.add("java02"); al.add("java03"); al.add("java04"); ArrayList<Integer> al2 = new ArrayList<>(); al2.add(11); al2.add(22); al2.add(33); al2.add(44); // print_Coll(al); // print_Coll(al2); // print_Coll2(al); // print_Coll2(al2); print_Coll3(al); print_Coll3(al2); } /** * ?上限定应用 * @param args */ public static void method_2(String[] args) { ArrayList<GenericDemo2_Person> al = new ArrayList<>(); al.add(new GenericDemo2_Person("java01")); al.add(new GenericDemo2_Person("java02")); al.add(new GenericDemo2_Person("java03")); ArrayList<GenericDemo2_Student> al2 = new ArrayList<>(); al2.add(new GenericDemo2_Student("java01")); al2.add(new GenericDemo2_Student("java02")); al2.add(new GenericDemo2_Student("java03")); print_Coll4(al); print_Coll4(al2); } /** * ?下限定应用 * 当treeSet和treeSet2都传入GenericDemo2_Student_Comp时,是不可行的,因为comparator接口做了向上限定 * 但是都传入GenericDemo2_Person_Comp是可行的,简单说实现Comparator接口,接口中泛型可以填写student的父类 * 这样的话即可以比较student,也可以比较person * * @param args */ public static void method_3(String[] args) { TreeSet<GenericDemo2_Student> treeSet = new TreeSet<>(new GenericDemo2_Person_Comp()); treeSet.add(new GenericDemo2_Student("java01")); treeSet.add(new GenericDemo2_Student("java03")); treeSet.add(new GenericDemo2_Student("java02")); TreeSet<GenericDemo2_Person> treeSet2 = new TreeSet<>(new GenericDemo2_Person_Comp()); treeSet2.add(new GenericDemo2_Person("java01")); treeSet2.add(new GenericDemo2_Person("java03")); treeSet2.add(new GenericDemo2_Person("java02")); print_Coll5(treeSet); print_Coll5(treeSet2); } /** * 不使用泛型 error * ArrayLt<String> al = new ArrayList<Integer>(); * @param al */ public static void print_Coll(ArrayList<String> al) { Iterator<String> it = al.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } /** * 使用泛型T * 可以使用泛型实例 * @param al */ public static <T> void print_Coll2(ArrayList<T> al) { Iterator<T> it = al.iterator(); while(it.hasNext()){ T t = it.next(); System.out.println(t); } } /** * 使用?占位符,效果与泛型是一样的,但是不能获取具体引用数据类型的实例 * @param al */ public static void print_Coll3(ArrayList<?> al) { Iterator<?> it = al.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } /** * ?上限定 * 若参数是ArrayList<GenericDemo2_Person> al * 那么当传入的是GenericDemo2_Person子类时? * ArrayList<GenericDemo2_Person> al = new ArrayList<GenericDemo2_Student>(); 这是一个error,编译期就不会通过 * * 那么我们又想操作GenericDemo2_Person子类的集合怎么办? * ?上限定就出现了 * 改为? extends GenericDemo2_Person * @param al */ public static void print_Coll4(ArrayList<? extends GenericDemo2_Person> al) { Iterator<?> it = al.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } /** * 配合下限定案例 * @param al */ public static void print_Coll5(Set<? extends GenericDemo2_Person> al) { Iterator<?> it = al.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } } class GenericDemo2_Person{ private String name; public GenericDemo2_Person() { } public GenericDemo2_Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } class GenericDemo2_Student extends GenericDemo2_Person{ public GenericDemo2_Student() { } public GenericDemo2_Student(String name) { super(name); } } class GenericDemo2_Worker extends GenericDemo2_Person{ public GenericDemo2_Worker() { } public GenericDemo2_Worker(String name) { super(name); } } class GenericDemo2_Student_Comp implements Comparator<GenericDemo2_Student>{ @Override public int compare(GenericDemo2_Student o1, GenericDemo2_Student o2) { return o1.getName().compareTo(o2.getName()); } } /** * 如果比较的student时,那么这么定义Comparator<Student> * 如果比较的worker时,那么这么定义Comparator<Worker> * * 这样的话,那么光person下的子类都会衍生很多的比较器 * 比较student、worker,由于Comparator<? super E>这种定义 * 所以就有了下面这种写法,person下的所有子类都可以使用该比较器 */ class GenericDemo2_Person_Comp implements Comparator<GenericDemo2_Person>{ @Override public int compare(GenericDemo2_Person o1, GenericDemo2_Person o2) { return o1.getName().compareTo(o2.getName()); } }
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有