【发布时间】:2018-11-04 16:24:02
【问题描述】:
以下代码来自我在 Android Studio 中的应用,运行良好:
static void removeViewParent(ImageView image) {
if (image.getParent() != null) ((ViewGroup) image.getParent()).removeView(image);
}
我尝试按照类似的想法重现它:因为原始类:抽象类ViewGroup 和ImageView 继承相同的超类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的一个实例。我怀疑您不太了解子类型/多态的概念。