Un artículo lo llevará a comprender las superposiciones y extensiones de los genéricos de Java.

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

/**

 * 生物

 */

static class Biological{

}

/**

 * 动物

 */

static class Animal extends Biological{

}

/**

 * 植物

 */

static class Plant extends Biological{

}

static class Dog extends Animal{

}

static class Cat extends Animal{

}

static class Flower extends Plant{

}

static class Tree extends Plant{

}

tabla de relaciones:

 

Código de prueba:

1

2

3

4

5

6

7

8

9

10

11

12

13

public static void main(String[] args) {

    List<? super Animal> listA = new ArrayList<>();

    List<? extends Plant> listB = new ArrayList<>();

    //listA.add(new Biological()); 

    listA.add(new Animal());

    listA.add(new Dog());

    //listA.add(new Flower());

    Object object = listA.get(0);

    //listB.add(new Plant());

    //listB.add(new Flower());

    listB.add(null);

    Plant plant = listB.get(0);

}

Acerca de la lista <? super T>

agregar aspecto

1

List<? super Animal> listA = new ArrayList<>();

1

listA.add(new Biological()); 

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

listA.add(new Animal());

listA.add(new Dog());

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

listA.add(new Flower());

Por supuesto, no es posible agregar Flower, porque no es una subclase de Animal.

aspecto del valor de retorno

1

Object object = listA.get(0);

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

List<? extends Plant> listB = new ArrayList<>();

1

listB.add(new Plant());

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

listB.add(new Flower());

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

listB.add(null);

Este es el caso especial, puedes agregar nulo, pero no tiene sentido.

aspecto del valor de retorno

1

Plant plant = listB.get(0);

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

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

Supongo que te gusta

Origin blog.csdn.net/qq_34412985/article/details/126089195
Recomendado
Clasificación