为什么findViewById()的返回值可以强制转换为Button?但Button是View的子类之一

时间:2016-08-14 04:02:20

标签: java android

在java中

    class Person{}
    class Student extends Person{}
    public class Test {
        public static void main(String[] args) {
            Person person = new Person();
            Student student = (Student)person;
        }
    }

有一个 "线程中的异常" main" java.lang.ClassCastException:无法将人员强制转换为学生"

2 个答案:

答案 0 :(得分:1)

你正在进行施法

不允许下面的向下施法。因为人不是学生或学生的子类的实例。

Student student = (Student)person;

下面的向下投射是可以的。因为findview的结果是Button的实现。

Button button = (Button)findViewById...

参考这个答案 https://stackoverflow.com/a/23414798/5183999

答案 1 :(得分:0)

如果你想用你的例子在Android中模拟案例,它应该是这样的:

class Person{}
class Student extends Person{}

public class Test {
    public static void main(String[] args) {
        Person person = getPerson();
        Student student = (Student) person;
    }

    private Person getPerson() {
        return new Student();
    }
}

哪个完全没问题。

这意味着findViewById()返回的对象实际上是Button,但是升级为View。稍后您需要将其转发到Button