Java 为什么向下投射抛出异常?
在java中:Java 为什么向下投射抛出异常?,java,classcastexception,downcast,Java,Classcastexception,Downcast,在java中: Base b = new Base(); Derived d = (Derived)b; 抛出ClassCastException。为什么?为什么向下广播在这里抛出异常?我想不出原因。让我重新命名你的类,让事情变得更清楚基础->动物派生的->Cat 仅仅因为你是一只动物,并不意味着你是一只猫。你可以是一只狗。这就是为什么把动物扔给猫是违法的 另一方面,每只猫都是动物吗?答案是肯定的。这就是为什么您可以编写这样的代码: Animal animal = new Cat(); 或
Base b = new Base();
Derived d = (Derived)b;
抛出
ClassCastException
。为什么?为什么向下广播在这里抛出异常?我想不出原因。让我重新命名你的类,让事情变得更清楚<代码>基础->动物
<代码>派生的->Cat
仅仅因为你是一只动物
,并不意味着你是一只猫
。你可以是一只狗
。这就是为什么把动物
扔给猫
是违法的
另一方面,每只猫都是动物吗?答案是肯定的。这就是为什么您可以编写这样的代码:
Animal animal = new Cat();
或
另外值得注意的是,您可以这样做:
之所以可以这样做,是因为
animal
变量实际上引用的是Cat
实例。因此,您可以将其转换回引用Cat
的变量中 不能将派生类强制转换为基类。您可以将b
指定为Base
或Derived
,但只能将d
指定为Derived
。长话短说,您只能为声明为Base
的变量分配相同类型(Base
)或派生类型的值
这没关系(我只是以new
为例,重要的是数据类型):
但这不是:
Derived d = new Base();
这就是继承的工作方式派生类从其超类继承行为。因此,将子类对象强制转换为超类引用是可行的,因为派生类对象能够满足超类定义的契约 另一方面,超类(通过定义类的方式)显然不能实现子类中存在的大多数方法。这就是为什么您首先扩展了super类,以扩展其实现
因此,将超类对象强制转换为子类类型是一种本质上不安全的操作,因为基类对象无法完全履行其子类的契约。要在Java中向下转换并避免运行时异常,请参考以下代码:
if (animal instanceof Cat) {
Cat cat = (Cat) animal;
}
在这里,Animal是父类,Cat是子类
instanceof是一个关键字,用于检查引用变量是否包含给定类型的对象引用。+1因为这是我第一次看到
Cat
而不是Dog
。Animal Animal=new Animal();猫=(猫)动物;动物怎样才能安全地被猫遗弃?
Base b = new Base();
Base b = new Derived();
Derived d = new Derived();
Derived d = new Base();
if (animal instanceof Cat) {
Cat cat = (Cat) animal;
}