Java 通过泛型避免向下投射?
考虑以下Java中的示例。我有一个方法,它接受一个Dog类型的对象(它扩展了Animal),并需要向它传递一个Animal类型的对象。我可以显式地向下转换,但希望避免这种情况并保持类型安全。有没有一种方法可以在Java中使用类型泛型? 谢谢 编辑 为了澄清我在做什么:我试图重构掉重复的代码(我在顶层有完全相同的代码,但根据传递的对象类型,在计算方式、可用的数据/方法等方面会有非常不同的行为) 显式向下投射是一种非常简单的方法,但我们试图避免这种情况,因为它通常不受欢迎,我认为使用泛型可能会有更合适的解决方案 简而言之,在编译时,我将知道我将拥有哪种类型的动物,因为我为每种类型的动物创建了我的类的单独实例。我认为在创建每个实例时,应该传递该类型,让编译器理解它是什么类型的对象,并为我安全地执行强制转换Java 通过泛型避免向下投射?,java,generics,casting,downcast,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);
}
}
Java有一个名为
instanceof
的关键字,用于检查某个类的对象是否实际上是子类的实例。因此,如果您希望安全,您应该检查ìf(狗的实例)因此,你不需要使用泛型来完成这一点,虽然我不太清楚检查<代码> StistAs< <代码>的开销,但是你的例子看起来像是一个学习的例子,所以它可能不会受到伤害。 < P>不,你不能这样做。
您已经为狗指定了方法,并且希望将其传递为泛型类型,即动物。如果该方法将接受泛型动物类型,则任何动物都可以传递到那里…更进一步,您的方法将执行doDogThing
,那么如果动物将是猫,该怎么办le.你会强迫一只猫躲闪,这是绝对禁止的。狗法
需要一只狗
。所以你不应该给它一只动物a
,它不可能是狗
,也可能是猫
,谁知道呢。那么你为什么要把它保存为动物
变量而不是e> 狗狗
?如果你必须施放(通常这首先表明一个糟糕的设计),至少检查一下(狗狗的实例)
自己能够对这种情况做出反应。你在这里真正想要实现什么?你的方法需要一只狗,但你希望能够传递不是狗的东西?你明确地删除了a
实例是狗的知识。如果你只有一只动物
,你想把它传递给一个需要它是一只狗
如果没有石膏,你就无法做到这一点,同时还要保证你的体型安全。石膏上写着“如果动物
实际上不是一只狗,我保证我会失败。”这样就保持了类型的安全性。@Zabuza,我添加了一个编辑,解释了更多我正在做的事情。动物示例只是这个问题的一个终结。似乎我必须使用instanceof和downcasting,因为泛型似乎不是我所想的。