JavaSE 通配符的使用一二


--------------------------关于泛型之中装了子父类之后,List能否再相互赋值一事--------------------------
假设
List<Object> list1 = null;
List<String> list2 = new ArrayList<String>();
请注意这两者是不存在子父类关系的,当装入List的那一刻,这两者的关系变味了并列关系
证明如下
  list1=list2;

那么list1这个List<Object>类型的指针就能指向List<String>类型的List了
同时因为list1是List<Object>类型的指针,所以能够写list1.add(123),这个时候123就被添加到List<String>中,编译报错,因为添加了不同数据类型的数据
list2=list1也是不可以的,二者不存在子父类关系,不能胡乱将两个不同类型的数据相互赋值,就像是把时间类赋给了字符串变量,牛头不对马嘴。


复习多态:
Object[] arr1=null;
string[] arr2=null;
arr1=arr2;//可以,这里是多态

------------------泛型的引进:如何解决不再有任何关系的List之间如何简化代码调用供同方法一事------------------

拥有相类似的方法但是不能共同调用怎么办?

public void show(List<Object> list){}//写法局限性很大,不建议
public void show1(List<String> list){}

因为List<Object>和List<String>不存在子父类的关系,所以这两者的对象在调用show()的时候必须要写两个show方法别分供二者使用,
所以Java发明了通配符(?),通配符的作用很简单,就是当二者的父类
一旦有了通配符?之后,二者所要分别调用的show1和show就可以一律改写成为:

public void show(List<?> list){}

list<?>成为List<String>和List<Object>的父类,什么都可以往通配符里面装

注意:
以下添加的写法是错误的,用过通配符的泛型不能向其内部添加数据(除了null之外)
List<?> list = null;
list.add(某个变量);//在上面一行代码的约束下:除了null以外,其他对象都不能通过add往里面添加
list.get(int index);//能够通过get读出变量,返回类型为Object;但是不能写!也就是add。


--------------------------关于通配符搭配extends和super的使用--------------------------

当通配符配合extends使用的时候
例如:
List<? extends Person> list = null;
这个地方只能找范围小于等于Person类来赋给list
例如存在一个
class Student extends Person{};
class Human extends Student{};
List<Student> list1 = null;
List<Human> list2 = null;
List<Object> list3 = null;
则可以写:
list=list1;
list=list2;
不可以写:
list=list3;//因为Object已经超过了通配符可以接住的范围了

当通配符配合super使用的时候
例如:
List<? super Person> list = null;
那么通配符能接住的范围就是大于等于Person了,即当List当中装着Person、Person的父类等,或者Object的时候,就能编译通过
class Student extends Person{};
List<Person> list1 = null;
List<Object> list2 = null;
List<Student> list3 = null;
list = list1;//成立
list = list2;//成立
list = list3;//错误,超出通配符能接受度的下限
原文地址:https://www.cnblogs.com/oldfish123/p/14592951.html