【问题标题】:Why does this code throw a ClassCastException?为什么这段代码会抛出 ClassCastException?
【发布时间】:2018-11-04 16:24:02
【问题描述】:

以下代码来自我在 Android Studio 中的应用,运行良好:

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

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

已编辑: Android SDK 中的原始类View 实际上是返回一个ViewParent 那么这怎么可能呢?

为什么我会收到 ClassCastException?

【问题讨论】:

  • getParent 返回一个 ViewParent 的 lambda,您尝试将其转换为 ViewGroup,但它不是...让您的 getParent 返回一个 ViewGroup 实例。 ..
  • @Jean-BaptisteYunès 我更新了我的问题,看看吧。
  • 您添加的内容没有帮助,因为它没有告诉我们mParent 是如何构建(或设置)的。我敢打赌它是ViewGroup 的一个实例。我怀疑您不太了解子类型/多态的概念。

标签: java android


【解决方案1】:

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

假设给定层次结构树(意味着您不能更改它),那么要使这项工作有效,您需要明确询问 getParent() 返回值的类型

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

【讨论】:

  • 但是在Android Studio的原始类中,getParent实际上是返回一个ViewParent,我会用一张图片更新我的问题。
  • 你不能在两个子类之间进行转换。仅在超类与其子类之间(向上转换或向下转换)
  • 更新后的问题不包含新信息。查看我编辑的答案
  • 修复了异常但不打印ViewGroupremoveView() 方法,这是我正在尝试做的。
  • 这可能是因为image 参数的父级确实不是ViewGroup 类型的对象。检查getParent()返回值的类型
【解决方案2】:

这将使getParent() 返回一个ViewGroup 的实例,因此它与ParentView 接口的实现使ViewGroup 兼容然后没有ClassCastException

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多