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

标签 java generics casting downcast

考虑以下 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/

相关文章:

java - 为什么程序员不显示异常?

java - 逆变类型上的 Kotlin 星投影

swift - 无法将 CGFloat 类型的值分配给 CGFloat 类型的值

java - Flyway DB迁移-如何访问应用服务(Spring配置)

java - 使用正则表达式在索引附近的未封闭组

java - 为什么允许 `T extends String`但给出警告?

c - 如何理解指针数组的类型转换?

java - 为什么分配 'int constant -> byte variable' 有效,但 'long constant -> int variable' 无效?

java - 如何使用 JPA 以并发安全的方式获取非重叠日期范围中的间隙?

c++ - 强制调用常量版本成员函数