通配符是泛型中非常重要的一个概念,它的作用是标明某些属性的类型是不确定的,比如说ArrayList<?>表示你可以给它赋值为ArrayList<String>,或者是ArrayList<Long>。提高了代码的复用性。但是当我们使用<? extends A>或是<? super A>的时候,读取与写入是与平常的ArrayList<String>不一样的。
首先,无论是哪种通配符都是可以读取的,只是返回值的类型不同。<? extends A>的返回值类型是A类,但是写入是不被允许的。而<? super A>的返回值是Object类,写入时只能写入A类的子类。这是因为由于多态性,子类是可以强转成父类的。但是<? extends A>表示该属性只能是A类的子类,而你给他添加元素的时候可能会添加一个?的子类,这样就不能被强转。而<? super A>表示?只能为A类的父类,这样无论你怎么小,只要是?的子类,就都能够被强转为?,从而正常赋值。
标签:java,读取,写入,ArrayList,通配符,子类,返回值,中泛 From: https://blog.csdn.net/2401_88005599/article/details/143953288