Java 通过泛型避免向下投射?

Java 通过泛型避免向下投射?,java,generics,casting,downcast,Java,Generics,Casting,Downcast,考虑以下Java中的示例。我有一个方法,它接受一个Dog类型的对象(它扩展了Animal),并需要向它传递一个Animal类型的对象。我可以显式地向下转换,但希望避免这种情况并保持类型安全。有没有一种方法可以在Java中使用类型泛型? 谢谢 编辑 为了澄清我在做什么:我试图重构掉重复的代码(我在顶层有完全相同的代码,但根据传递的对象类型,在计算方式、可用的数据/方法等方面会有非常不同的行为) 显式向下投射是一种非常简单的方法,但我们试图避免这种情况,因为它通常不受欢迎,我认为使用泛型可能会有更合

考虑以下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);
    }
}

Java有一个名为
instanceof
的关键字,用于检查某个类的对象是否实际上是子类的实例。因此,如果您希望安全,您应该检查
ìf(狗的实例)因此,你不需要使用泛型来完成这一点,虽然我不太清楚检查<代码> StistAs< <代码>的开销,但是你的例子看起来像是一个学习的例子,所以它可能不会受到伤害。

< P>不,你不能这样做。
您已经为
指定了方法,并且希望将其传递为泛型类型,即
动物
。如果该方法将接受泛型
动物
类型,则任何动物都可以传递到那里…更进一步,您的方法将执行
doDogThing
,那么如果
动物
将是
,该怎么办le.你会强迫一只猫躲闪,这是绝对禁止的。

狗法
需要一只
。所以你不应该给它一只
动物a
,它不可能是
,也可能是
,谁知道呢。那么你为什么要把它保存为
动物
变量而不是
e> 狗狗
?如果你必须施放(通常这首先表明一个糟糕的设计),至少检查一下(狗狗的实例)
自己能够对这种情况做出反应。你在这里真正想要实现什么?你的方法需要一只狗,但你希望能够传递不是狗的东西?你明确地删除了
a
实例是狗的知识。如果你只有一只
动物
,你想把它传递给一个需要它是一只
如果没有石膏,你就无法做到这一点,同时还要保证你的体型安全。石膏上写着“如果
动物
实际上不是一只
狗,我保证我会失败。”这样就保持了类型的安全性。@Zabuza,我添加了一个编辑,解释了更多我正在做的事情。动物示例只是这个问题的一个终结。似乎我必须使用instanceof和downcasting,因为泛型似乎不是我所想的。