java 通配符解惑
来源:互联网 发布:少女时代930事件知乎 编辑:程序博客网 时间:2024/06/06 00:20
i 标记: 通配符,wildcard,java
public class Animal {private String name;public Animal(String name) {this.name = name;}public void eat() {System.out.println(getName() + " can eat.");}public String getName(){return name;}}
public class Cat extends Animal {public Cat(String name) {super(name);}public void jump(){System.out.println(getName() + " can jump.");}}
public class Bird extends Animal {public Bird(String name) {super(name);}public void fly(){System.out.println(getName() + " can fly.");}}
public class Magpie extends Bird {public Magpie(String name) {super(name);}public void sing(){System.out.println(getName() + " can not only eat,but sing");}}
public class AnimalTrainer {public void act(List<Animal> list) {for (Animal animal : list) {animal.eat();}}}
public class TestAnimal {public static void main(String[] args) {AnimalTrainer animalTrainer = new AnimalTrainer();//Test 1List<Animal> animalList = new ArrayList<>();animalList.add(new Cat("cat1"));animalList.add(new Bird("bird1"));animalTrainer.act(animalList);//可以通过编译//Test 2List<Cat> catList = new ArrayList<>();catList.add(new Cat("cat2"));catList.add(new Cat("cat3"));animalTrainer.act(catList);//无法通过编译}}
一、通配符的上界
public class AnimalTrainer {public void act(List<? extends Animal> list) {for (Animal animal : list) {animal.eat();}}}
public class TestAnimal {public static void main(String[] args) {AnimalTrainer animalTrainer = new AnimalTrainer();//Test 1List<Animal> animalList = new ArrayList<>();animalList.add(new Cat("cat1"));animalList.add(new Bird("bird1"));animalTrainer.act(animalList);//可以通过编译//Test 2List<Cat> catList = new ArrayList<>();catList.add(new Cat("cat2"));catList.add(new Cat("cat3"));animalTrainer.act(catList);//也可以通过编译}}
- G<? extends Y> 是 G<? extends X>的子类型(如List<? extends Cat> 是 List<? extends Animal>的子类型)。
- G<X> 是 G<? extends X>的子类型(如List<Animal> 是 List<? extends Animal>的子类型)
- G<?> 与 G<? extends Object>等同,如List<?> 与List<? extends Objext>等同。
public void testAdd(List<? extends Animal> list){//....其他逻辑list.add(new Animal("animal"));list.add(new Bird("bird"));list.add(new Cat("cat"));}
List<? extends Animal> list = new ArrayList<>();list.add(new Animal("animal"));list.add(new Bird("bird"));list.add(new Cat("cat"));
二、通配符的下界
- G<? super X> 是 G<? super Y>的子类型(如List<? super Animal> 是 List<? super Bird>的子类型)。
- G<X> 是 G<? super X>的子类型(如List<Animal> 是 List<? super Animal>的子类型)
public void testAdd(List<? super Bird> list){list.add(new Bird("bird"));list.add(new Magpie("magpie"));}
List<? super Bird> list = new ArrayList<>();list.add(new Bird("bird"));list.add(new Magpie("magpie"));list.add(new Animal("animal"));
for (Object object : list) {//...}
public class Student implements Comparable<Student>{private int id;public Student(int id) {this.id = id;}@Overridepublic int compareTo(Student o) {return (id > o.id) ? 1 : ((id < o.id) ? -1 : 0);}}
public class CollegeStudent extends Student{public CollegeStudent(int id) {super(id);}}
public static <T extends Comparable<? super T>> void selectionSort(T[] a,int n)
CollegeStudent[] stu = new CollegeStudent[]{ new CollegeStudent(3),new CollegeStudent(2), new CollegeStudent(5),new CollegeStudent(4)};
public static <T extends Comparable<T>> void selectionSort(T[] a,int n)
三、无界通配符
public static void printList(List<Object> list) { for (Object elem : list) System.out.println(elem + " "); System.out.println();}
public static void printList(List<?> list) { for (Object elem: list) System.out.print(elem + " "); System.out.println();}
List<Integer> li = Arrays.asList(1, 2, 3);List<String> ls = Arrays.asList("one", "two", "three");printList(li);printList(ls);
public class SortArray {//对一组数组对象运用插入排序,n指数组元素的个数public static <T extends Comparable<? super T>> void selectionSort(T[] a,int n) {for (int index = 0; index < n-1; index++) {int indexOfSmallest = getIndexOfSmallest(a,index,n-1);swap(a,index,indexOfSmallest);}}public static <T extends Comparable<? super T>> int getIndexOfSmallest(T[] a, int first, int last) {T minValue = a[first]; // 假设第一个为minValueint indexOfMin = first; // 取得minValue的下标for (int index = first + 1; index <= last; index++) {if (a[index].compareTo(minValue) < 0) {minValue = a[index];indexOfMin = index;}}return indexOfMin;}public static void swap(Object[] a,int first,int second) {Object temp = a[first];a[first] = a[second];a[second] = temp;}public static void main(String[] args) {CollegeStudent[] stu = new CollegeStudent[]{new CollegeStudent(3),new CollegeStudent(2),new CollegeStudent(5),new CollegeStudent(4)};selectionSort(stu, 4);for (Student student : stu) {System.out.println(student);}}}
0 0
- java 通配符解惑
- java 通配符解惑
- Java 通配符解惑
- Java通配符解惑
- Java 泛型通配符?解惑
- Java 泛型通配符?解惑
- Java 泛型通配符?解惑
- Java泛型通配符解惑
- Java 泛型通配符?解惑
- Java 泛型通配符?解惑
- Java 泛型通配符?解惑
- Java 泛型通配符?解惑
- Java 泛型通配符解惑
- Java 之泛型通配符 ? extends T 与 ? super T 解惑
- 《Java解惑》
- java解惑
- java解惑
- java解惑
- 简单了解一下--谓词(NSPredicate)
- iOS打包pod spec
- 自定义弹出提示框
- Oracle关于创建存储过程权限问题以及带参数的游标的范例
- 用PL/SQL导出SQL语句
- java 通配符解惑
- linux下的文件服务器[ftp(ftp/tftp)、 Samba、NFS服务器
- find指令详解
- css3小知识点收录
- 关于c++中cin获取字符串的某些问题
- 转载-JAVA并发多线程
- C#关闭后台进程
- Mysql插入数据报错处理
- svn之Locked