从父类到子类的类型转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从父类到子类的类型转换相关的知识,希望对你有一定的参考价值。

我对Java语言中的类型转换有误解。问题是ClassCastException。例如,在此代码中,假设Animal是Dog类的父类,

Animal animal = new Animal();
Dog dog = (Dog) animal;

执行后抛出ClassCastException。但是,在研究android包时,我发现了一个关于类型转换的例子,它应该抛出一个ClassCastException,考虑到这个例子。

EditText editText = (EditText) findViewById(R.id.edit_message);

在这段代码中,findViewById方法返回一个View类对象,它是EditText类的超类之一。(从android.view.View到android.widget.EditText)代码运行正常。任何人都可以解释我是否犯了错误或者这是怎么回事?

提前致谢。

答案

创建对象后,无法更改其类型。这就是为什么你不能把动物变成狗的原因。

但是,如果创建子类的对象,则可以在超类类型的变量中保留对它的引用,稍后可以将其强制转换为子类类型。

这将有效:

Animal a = new Dog ();
Dog d = (Dog) a;

在Android示例中,您有一个如下所示的布局资源:

<EditText
    android:id="@+id/edit_message"
 ..."/>

此定义将导致Android创建EditText的实例,因此您可以将findViewById返回的视图强制转换为EditText。你不能把它投射到任何不是超级型EditText的东西上。

另一答案

基本上,您不能将超类的实例强制转换为子类,因为子类的实例尚不可知。向上转换是防止此异常发生的可靠方法,因为我们现在正在处理代码的多态性。

您必须首先实例化一个子类:

Dog dog = new Dog;

我们可以通过将其类型化为其超类来隐藏未找到其类Parent的类的方法:

Animal animal = (Animal) dog;

然后你可以将它转发回你的子类Dog,因为它的子类的实例已经知道了:

Dog anotherDog = (Dog) animal;
另一答案

你可以试试这个:

Base obj= new Derived();
Derived obj2= (Derived)obj;

希望这会有所帮助。

以上是关于从父类到子类的类型转换的主要内容,如果未能解决你的问题,请参考以下文章

instanceof和getClass的区别

尽管子类中也有相同的方法,但如何从父类停止子类对象的调用方法

如何从父类和子类的相同方法返回泛型类型

是否可以从父类指针向下转换为第二个子类中的子类指针?

java子类从父类继承某个属性,怎么添加特定的注解不影响父类

Flutter 从父类调用子类函数