[英]Why does this code throw a ClassCastException?
下面的代码来自我在Android Studio中的App,它运行良好:
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);
}
}
线程“主”中的异常java.lang.ClassCastException:无法将View $$ Lambda $ 1/1078694789强制转换为ViewGroup。
编辑: Android SDK中的原始类View
实际上正在返回ViewParent
这怎么可能?
为什么我收到ClassCastException?
ViewGroup
和ImageView
都是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.