泛型的继承 与 通配符
package com.sq.java2;
public class Person {
}
package com.sq.java2;
public class Student extends Person{
}
package com.sq.java2;
import org.junit.Test;
import java.util.*;
/*
1.泛型在继承方面的体现
2.通配符的使用
*/
public class GenericTest {
/*
1.泛型在继承方面的体现
虽然类 A 是类 B 的父类,但是G<A> 和 G<B> 二者不具备父类关系,二者是并列关系
补充:类 A 是类 B 的父类,A<G> 是 B<G> 的父类
*/
@Test
public void test1(){
Object obj = null;
String str = null;
obj = str;
Object[] arr1 = null;
String[] arr2 = null;
arr1 = arr2;
List<Object> list1 = null;
List<String> list2 = null;
// 此时的 list1 和 list2 的类型不具有子父类关系
// list1 = list2; // 编译不通过
// 与下面报错相似
// Date date = new Date();
// str = date; // 编译不通过
/*
反证法:
假设 list1 = list2;
list1.add(123); 导致混入非 String 的数据。出错。
*/
show(list1);
// show(list2);// 报错
show1(list2);
}
public void show(List<Object> list){
}
public void show1(List<String> list){
}
@Test
public void test2(){
// 实现接口
List<String> list1 = null;
// 继承父类
AbstractList<String> list2 = null;
ArrayList<String> list3 = null;
list1 = list2;
list2 = list3;
List<String> list4 = new ArrayList<>();
}
/*
2.通配符的使用
通配符:?
类 A 是类 B 的父类,G<A> 和G<B> 是没有关系的,二者共同的父类是: G<?>
*/
@Test
public void test3(){
List<Object> list1 = null;
List<String> list2 = null;
// List<?> 是 List<Object> 和 List<String> 的父类
List<?> list = null;
list = list1;
list = list2;
// 编译通过
// print(list1);
// print(list2);
//
List<String> list3 = new ArrayList<>();
list3.add("AA");
list3.add("BB");
list3.add("CC");
list = list3;
System.out.println(list);// [AA, BB, CC]
// 添加(写入):对于 List<?> 就不能向其内部添加数据。
// 除了添加 null 之外。
// list.add("DD");
// list.add('?');
list.add(null);
System.out.println(list);// [AA, BB, CC, null]
// 获取(读取):允许读取数据,读取的数据类型为 Object。
Object o = list.get(0);
System.out.println(o); // AA
}
public void print(List<?> list){
Iterator<?> iterator = list.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
System.out.println(obj);
}
}
/*
3.有限制条件的通配符的使用
? extends A:
G<? extends A> 可以作为 G<A> 和 G<B> 的父类,其中 B 是 A 的子类
? super A:
G<? super A> 可以作为G<A> 和 G<B> 的父类,其中 B 是 A 的父类
*/
@Test
public void test4(){
List<? extends Person> list1 = null;// extends 相当于 <=
List<? super Person> list2 = null;// super 相当于 >=
List<Student> list3 = null;
List<Person> list4 = null;
List<Object> list5 = null;
list1 = list3;
list1 = list4;
// list1 = list5;
// list2 = list3;
list2 = list4;
list2 = list5;
// 读取数据:
list1 = list3;
Person p = list1.get(0);
// 编译不通过
// Student s = list1.get(0);
list2 = list4;
Object obj = list2.get(0);
// 编译不通过
// Person obj = list2.get(0);
// 写入数据:
// 编译不通过
// list1.add(new Student());
// 编译通过
list2.add(new Person());
list2.add(new Student());
}
}