El concepto es simple de entender.
List<? extends T>
Indica que todas las subclases de tipo T existen en la colección, incluido el propio T.List<? super T>
Indica que todas las colecciones se almacenan en la clase principal de tipo T, incluido el propio T.
Interpretación de ejemplos de código.
Código de clase entre padres e hijos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 |
|
tabla de relaciones:
Código de prueba:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Acerca de la lista <? super T>
agregar aspecto
1 |
|
1 |
|
No se permite ejecutar la línea de código anterior, porque el tipo de colección de listA es Animal o una clase principal superior. Piénselo, si el tipo representado es Animal, ¿cómo se puede agregar su clase principal Biológica? Por supuesto que no está permitido.
1 2 |
|
La ejecución de las dos oraciones anteriores se puede ejecutar normalmente, porque ya sea Animal o la subclase de Animal, Perro, se puede almacenar en la colección de la clase principal cuyo tipo de colección es Animal o superior. Un poco complicado, pero eso es lo que significa.
1 |
|
Por supuesto, no es posible agregar Flower, porque no es una subclase de Animal.
aspecto del valor de retorno
1 |
|
Debido a que el tipo de colección de listA es Animal o una clase principal superior, no está claro qué clase será, pero todos debemos saber que la clase principal de todas las clases es Objeto, por lo que el valor de retorno es de tipo Objeto.
Acerca de la lista<? extendsT>
agregar aspecto
1 |
|
1 |
|
No se permite ejecutar el código anterior, porque el tipo de colección de listB es Plant o una subclase de Plant. Piénselo, si el tipo representado es Tree, una subclase de Plant, ¿cómo puede agregar su clase principal Plant? Entonces es similar a la comprensión anterior, que es la comprensión inversa. Puede quedar más claro mirando la imagen.
1 |
|
De la misma manera, la forma de representar el tipo es la subclase Rose (rosa) de Flower, por lo que, por supuesto, no es posible agregar su clase principal Flower.
1 |
|
Este es el caso especial, puedes agregar nulo, pero no tiene sentido.
aspecto del valor de retorno
1 |
|
Debido a que el tipo de colección de listB es Plant o sus subclases, no está claro qué clase será, pero podemos saber que el tipo más alto es Plant, por lo que el valor de retorno es de tipo Plant.
Resumir
- List<? extends T> significa que todas las clases principales de tipo T se almacenan en la colección, incluido el propio T
- agregar: no se puede agregar ningún objeto (caso especial: se puede agregar nulo)
- get: el tipo de objeto devuelto por get es T
- List<? superT>表示该集合中存在的都是类型T的子类,包括T自己
- add:只能添加T及T的子类
- get:get返回的对象类型为Object
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!