Um artigo leva você a entender o super e as extensões dos genéricos Java

O conceito é simples de entender

  • List<? extends T>Indica que todas as subclasses do tipo T existem na coleção, incluindo o próprio T
  • List<? super T>Indica que todas as coleções são armazenadas na classe pai do tipo T, incluindo o próprio T

Interpretação de exemplos de código

Código da classe pai-filho:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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{

}

gráfico de relação:

 

Código de teste:

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);

}

Sobre a lista<?super T>

adicionar aspecto

1

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

1

listA.add(new Biological()); 

A execução da linha de código acima não é permitida, pois o tipo de coleção de listA é Animal ou uma classe pai superior. Pense nisso, se o tipo representado for Animal, como posso adicionar sua classe pai Biológica? Claro que não é permitido.

1

2

listA.add(new Animal());

listA.add(new Dog());

A execução das duas sentenças acima pode ser executada normalmente, pois seja Animal ou a subclasse Dog de Animal, ela pode ser armazenada na coleção da classe pai cujo tipo de coleção é Animal ou superior. Um pouco complicado, mas é isso que significa.

1

listA.add(new Flower());

Obviamente, adicionar Flower não é possível, porque não é uma subclasse de Animal.

aspecto do valor de retorno

1

Object object = listA.get(0);

Como o tipo de coleção de listA é Animal ou uma classe pai superior, não está claro qual classe será, mas todos devemos saber que a classe pai de todas as classes é Object, então o valor de retorno é do tipo Object.

Sobre a lista<?extendsT>

adicionar aspecto

1

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

1

listB.add(new Plant());

A execução do código acima não é permitida, pois o tipo de coleção da listaB é Plant ou uma subclasse de Plant. Pense bem, se o tipo representado é Tree, uma subclasse de Plant, como ele pode adicionar sua classe pai Plant? Portanto, é semelhante ao entendimento acima, que é o entendimento inverso. Pode ficar mais claro olhando a foto.

1

listB.add(new Flower());

Da mesma forma, como representar o tipo é a subclasse Rose (rosa) de Flor, então é claro que não é possível adicionar sua classe pai Flor.

1

listB.add(null);

Este é o caso especial, você pode adicionar nulo, mas não faz sentido.

aspecto do valor de retorno

1

Plant plant = listB.get(0);

Como o tipo de coleção de listB é Plant ou suas subclasses, não está claro qual classe será, mas podemos saber que o tipo mais alto é Plant, portanto o valor de retorno é do tipo Plant.

Resumir

  • List<?estende T> significa que todas as classes pai do tipo T são armazenadas na coleção, incluindo o próprio T
    • add: Não é possível adicionar nenhum objeto (caso especial: nulo pode ser adicionado)
    • get: O tipo de objeto retornado por get é T
  • List<? superT>表示该集合中存在的都是类型T的子类,包括T自己
    • add:只能添加T及T的子类
    • get:get返回的对象类型为Object

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

Acho que você gosta

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