Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么向下投射抛出异常?_Java_Classcastexception_Downcast - Fatal编程技术网

Java 为什么向下投射抛出异常?

Java 为什么向下投射抛出异常?,java,classcastexception,downcast,Java,Classcastexception,Downcast,在java中: Base b = new Base(); Derived d = (Derived)b; 抛出ClassCastException。为什么?为什么向下广播在这里抛出异常?我想不出原因。让我重新命名你的类,让事情变得更清楚基础->动物派生的->Cat 仅仅因为你是一只动物,并不意味着你是一只猫。你可以是一只狗。这就是为什么把动物扔给猫是违法的 另一方面,每只猫都是动物吗?答案是肯定的。这就是为什么您可以编写这样的代码: Animal animal = new Cat(); 或

在java中:

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;
}