gpt4 book ai didi

Java - 将对象以多态方式传递给接受通用参数的方法

转载 作者:行者123 更新时间:2023-11-29 06:04:23 25 4
gpt4 key购买 nike

我正在阅读“Head First Java”——一本非常棒的 Java 入门书。我有一个关于泛型的问题。

这本书已经正确地指出不可能以多态方式将子类型传递给接受 ArrayList 的方法。下面的示例-

public class Animal {

}

public class Dog extends Animal {

}

public class Cat extends Animal {

}

public class AnimalTester {
public static void main (String[] args) {
new AnimalTester().go();
}


public void go() {
List<Animal> animalList=new ArrayList<Animal>();
List<Dog> dogList=new ArrayList<Dog>();
processAnimals(animalList); // this would compile
processAnimals(dogList); // this would not compile
}

public void processAnimals(List<Animal> animalList) {

}

}

但是上面的问题可以通过使用泛型来解决-

public <T extends Animal> void processAnimals(List<T> animalList) {

}

但在上述情况下,如果尝试将任何内容添加到列表中(这在书中提到),编译器将抛出异常。我用我的 IDE 试了一下,它确实抛出了一个异常。书中还提到这是为了确保将不正确的对象(例如 cat)添加到列表(在我们的例子中为 dogList)。

但是我可以通过使用 (T) 转换猫/狗/动物对象来做到这一点。

public <T extends Animal> void processAnimals(List<T> animalList) {
animalList.add(new Animal()); // compilation Error
animalList.add(new Dog()); // compilation Error
animalList.add(new Cat()); // compilation Error
animalList.add((T) new Cat()); // works and I can also cast it back
// to Cat and get a Cat object
}

根据这本书,Java 创建者抛出异常的全部原因是不应该将不正确的对象添加到列表中。然而,Java 是否允许它,因为程序员正在显式转换它,从而说“我知道我在做什么”?

最佳答案

基本上,您在编译器上执行了结束运行。

您必须考虑泛型的全部要点。它们仅用于编译时安全。他们什么都不给你买。在运行时,由于类型删除,您仍在处理 List<Object> ,它可以容纳任何东西。如果您决定显式转换某些内容,那么编译器不会再猜测您。您已将潜在危险从编译时转移到运行时,这是您的选择。

关于Java - 将对象以多态方式传递给接受通用参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9047901/

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