当前位置: 首页 > 知识库问答 >
问题:

ClassCastException“父级不能强制转换为类…在加载程序'app'的未命名模块中”,带有Java泛型和继承

汤飞翮
2023-03-14

我目前在Java面临一个仿制药的问题。我需要返回一个已转换到子级的父级实例。

下面的示例显示了我正在尝试实现的目标。

public class GenericTest {

    @Test
    public void test() {
        assertEquals("child", new B().returnParentInstanceAsChild().name());
    }

    public static class Parent {
        public String name() {
            return "parent";
        }
    }

    public static abstract class A<Child extends Parent> {
        public Child returnParentInstanceAsChild() {
            return (Child) new Parent();
        }
    }

    public static class ChildEntity extends Parent {
        @Override
        public String name() {
            return "child";
        }
    }

    public static class B extends A<ChildEntity> {
    }

}

此代码不运行,而是产生以下异常:

类com.generics.generictest$parent不能强制转换为类com.generics.generictest$childEntity(com.generics.generictest$parent和com.generics.generictest$childEntity在加载器'app'的未命名模块中)java.lang.classcastException:类com.generics.generictest$parent不能强制转换为类com.generics.generictest$childEntity(com.generics.generictest$childEntity在加载器'app'的未命名模块中)

我想知道为什么它会失败,因为我们已经强制要求子级必须是parent类型。

为什么会出现问题,如何解决问题?

共有1个答案

詹唯
2023-03-14

此操作失败的原因与下面一行失败的原因相同:

ChildEntity child = (ChildEntity) new Parent();

在运行时,强制转换将失败,因为不是ChildEntity

您可能希望使子类负责创建子实例,因此可以使父类方法抽象:

public static abstract class A<T extends Parent> {
    public abstract T returnParentInstanceAsChild();
}

public static class B extends A<ChildEntity> {

    @Override
    public ChildEntity returnParentInstanceAsChild() {
        return new ChildEntity();
    }
}
 类似资料: