【问题标题】:ClassCastException "Parent cannot be cast to class...are in unnamed module of loader 'app' " with Java Generics and inheritanceClassCastException“父级不能强制转换为类......在加载器'app'的未命名模块中”,带有Java泛型和继承
【发布时间】:2021-03-17 09:26:15
【问题描述】:

我目前面临 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$Parent 和 com.generics.GenericTest$ChildEntity 位于加载程序'app 的未命名模块中')

我想知道为什么它会失败,因为我们强制 Child 必须是Parent 类型。

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

【问题讨论】:

    标签: java generics inheritance classcastexception


    【解决方案1】:

    这失败的原因与以下行失败的原因相同:

    ChildEntity child = (ChildEntity) new Parent();
    

    在运行时,转换将失败,因为 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();
        }
    }
    

    【讨论】:

    • 非常感谢。是的,您是对的,Parent 不是子实体,对我来说并不是很明显,它更像是相反的方式:) 将实例从子级传递给父级的解决方案很棒并且为我解决了它。
    猜你喜欢
    • 1970-01-01
    相关资源
    最近更新 更多