繁体   English   中英

为什么这段代码会引发ClassCastException?

[英]Why does this code throw a ClassCastException?

下面的代码来自我在Android Studio中的App,它运行良好:

static void removeViewParent(ImageView image) {
    if (image.getParent() != null) ((ViewGroup) image.getParent()).removeView(image);
}

我试图按照类似的想法重现它:由于原始想法:抽象类ViewGroupImageView继承了相同的超类View并且其方法getParent()返回接口引用。 使用IntelliJ IDEA,我在以下代码中出于铸造目的进行了类似的复制:

interface ViewParent {
    ViewParent getParentView();
}

class View {
    ViewParent getParent() {
        return () -> null;
    }
}

abstract class ViewGroup extends View implements ViewParent {
    void removeView(ImageView image) {
        System.out.println(image); //Just for debugging.
    }
}

class ImageView extends View {
}

class RunMain {
    public static void main(String[] args) {
        ImageView image = new ImageView();
        ((ViewGroup) image.getParent()).removeView(image);
    }
}

线程“主”中的异常java.lang.ClassCastException:无法将View $$ Lambda $ 1/1078694789强制转换为ViewGroup。

编辑: Android SDK中的原始类View实际上正在返回ViewParent这怎么可能?

在此处输入图片说明 在此处输入图片说明

为什么我收到ClassCastException?

ViewGroupImageView都是View子类,但是它们没有直接的继承关系(超级子类)。 一个不能在两个子类之间转换。 仅在超类及其子类之间(上铸造或下铸造)

假设给出了层次结构树(这意味着您无法更改它),那么要进行此工作,您需要明确询问getParent()返回值的类型

if (image.getParent() != null && image.getParent() instanceof ViewGroup) { 
   ((ViewGroup) image.getParent()).removeView(image);
}

这将使getParent()返回ViewGroup的实例,因此其与ParentView Interface的实现使ViewGroup兼容,因此没有ClassCastException

class View {
    ViewParent getParent() {
        return new ViewGroup() {
            @Override
            public ViewParent getParentView() {
                return null;
            }
        };
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM