gpt4 book ai didi

java - 通过泛型避免向下转型?

转载 作者:行者123 更新时间:2023-12-01 19:41:09 24 4
gpt4 key购买 nike

考虑以下 Java 示例。我有一个方法,它采用 Dog 类型的对象(扩展 Animal),并且需要向其传递 Animal 类型的对象。我可以明确地向下转型,但想避免这种情况并保持类型安全。有没有办法在 Java 中使用类型泛型来解决这个问题?谢谢!

编辑为了澄清我在做什么:我正在尝试重构重复的代码(我在顶层有完全相同的代码,但根据传递的对象类型,计算的完成方式将有非常不同的行为,并且有哪些数据/方法可用等。

显式向下转型是一种非常简单的方法,但我们试图避免这种情况,因为它通常不受欢迎,而且我认为使用泛型可能有更合适的解决方案。

简而言之,在编译时,我会知道我将拥有哪种类型的动物,因为我为每种类型的动物创建了我的类的单独实例。我认为在创建每个实例时可以将类型向下传递,并使编译器了解它是什么类型的对象并为我安全地进行转换。

public class Test {
interface Animal {
void speak();
}
class Cat implements Animal {
@Override
public void speak() {}
}
static class Dog implements Animal {
@Override
public void speak() {}
public void doDogThing() {}
}
static void dogMethod(Dog d) {
d.doDogThing();
}
public static void main(String[] args) {
Animal a = new Dog();
dogMethod(a);
}
}

最佳答案

不,你不能那样做。考虑一下:

您已为 Dog 指定了方法,并且希望向其传递泛型类型,即 Animal。如果该方法接受通用 Animal 类型,那么任何动物都可以传递到那里...更进一步,您的方法执行 doDogThing,那么如果 Animal 会怎样?例如,code> 是一个 Cat 。你会强制猫做doDogThing,这是绝对禁止的。

关于java - 通过泛型避免向下转型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59173045/

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