gpt4 book ai didi

java - 使用通用类和通用集合类型的声明有什么区别

转载 作者:搜寻专家 更新时间:2023-11-01 02:09:25 25 4
gpt4 key购买 nike

我将向您展示泛型声明的两种风格。在第 1 部分中,我在 List 上使用通用上边界声明,如下所示:

List<? extends Animal> totList = new ArrayList<Animal>();

但是如果您尝试将 Animal 对象添加到列表中,将会抛出如下错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
The method add(capture#1-of ? extends Animal) in the type List<capture#1-of ? extends Animal> is not applicable for the arguments (Animal)

at GenericsType.main(GenericsType.java:39)

但与第 2 部分一样,如果我以下面的格式在泛型类中声明列表,则在将(动物对象)或(动物对象的子类)添加到列表时不会抛出任何错误。

class GenericAnimal<T extends Animal> 
{
List<T> genList = new ArrayList<T>();
}

为什么在第二部分没有抛出错误,两种声明方式有什么区别。

示例代码:

1.Animal.java

public class Animal {
private String name;
private int height;

public void animalJump()
{
if(height>100)
{
System.out.println(name+" with height-"+height+" can JUMP");
}
else
System.out.println(name+" with height-"+height+" cannot jump");
}

public void setName(String name) {
this.name = name;
}

public void setHeight(int height) {
this.height = height;
}

public Animal(String name, int height) {
setName(name);
setHeight(height);
}

}

2.GenericsType.java

import java.util.*;
import Animal;
import Animal.Cannine;
import Animal.Feline;
import Animal.Feline.Cat;
import Animal.Cannine.Dog;

public class GenericsType {

public static List<? extends Animal> totList = new ArrayList<Animal>();

public static void processAllfunc1()
{
for(Animal a : totList)
{
a.animalJump();
}

}

public static void main(String args[])
{
// Part 1
totList.add(new Animal("Animal1",21)); // Error: Unresolved compilation problem:
processAllfunc1();


// Part 2
GenericAnimal<Animal> genericanimal = new GenericAnimal<Animal>();
genericanimal.genList.add(new Animal("Animal2",22)); // No Error, why?
genericanimal.genList.add(new Cat("Cat4",204)); // No Error for Cat also, why?

genericanimal.processAllfunc2();
}
}

3.GenericAnimal.java

public class GenericAnimal<T extends Animal> {  

public List<T> genList = new ArrayList<T>();

public void processAllfunc2() {
for (T a : genList) {
a.animalJump();
}
}
}

最佳答案

在第 2 部分中,genericanimal.genList 的类型是List<T> = List<Animal> .在第 1 部分中,列表的类型是 List<? extends Animal> .

问题是 List<? extends Animal>意思是“一些未知的特定动物亚型的列表。”例如,您可以编写 List<? extends Animal> list = new ArrayList<Cat>() .而且您不应该能够将任何动物添加到猫的列表中。通过写 List<? extends Animal> ,你是说你想故意忘记哪种动物类型被允许进入列表,尽管你知道列表中的任何东西都是某种动物类型.

关于java - 使用通用类和通用集合类型的声明有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21315534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com