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

"父类不能被强制转换到类...在加载器'应用'的未命名模块中,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> {
    }

}

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

班级通讯。仿制药。GenericTest$Parent不能强制转换为com类。仿制药。GenericTest$ChildEntity(com.generics.GenericTest$Parent和com.generics.GenericTest$ChildEntity位于加载程序“app”)java的未命名模块中。ClassCastException:class com。仿制药。GenericTest$Parent不能强制转换为com类。仿制药。GenericTest$ChildEntity(com.generics.GenericTest$Parent和com.generics.GenericTest$ChildEntity位于加载程序“app”的未命名模块中)

我想知道为什么它失败了,因为我们已经强制要求孩子必须是父母类型。

为什么会有问题?如何解决?

共有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();
    }
}
 类似资料:
  • 我目前在Java面临一个仿制药的问题。我需要返回一个已转换到子级的父级实例。 下面的示例显示了我正在尝试实现的目标。 此代码不运行,而是产生以下异常: 类com.generics.generictest$parent不能强制转换为类com.generics.generictest$childEntity(com.generics.generictest$parent和com.generics.ge

  • 我的错误:- java.lang.ClassCastException:类*不能强制转换为类java.io.Serializable(*位于加载程序'app'的未命名模块中;java.io.Serializable位于加载程序'bootstrap'的模块java.base中) 表示包和类名。

  • 我的错误:- java.lang.ClassCastException:类*不能强制转换为类java.io.Serializable(*位于加载程序'app'的未命名模块中;java.io.Serializable位于加载程序'bootstrap'的模块java.base中) 表示包和类名。

  • 我有一个通用类。它看起来像这样: 显然,conevertdatajsonstring方法仅在字符串类型为T时调用。但有一个警告: 类型安全:未选中从字符串转换为T 有没有一种方法可以在不使用SuppressWarnings的情况下解决此问题: @抑制警告(“未选中”) 方法之前?

  • 从上面的标题来看,目前我遇到了一个问题,即无法从一个模型类转换到另一个模型类。我写的代码有问题吗?请随时向我询问更多信息。非常感谢。 我怀疑: 这种方法“selectTheOldFnException”有一些错误,那就是使用了hibernate,但我不确定这个理论。 REST控制器 使用HIBERNATE-MatchingEngine选择POJO。班 POJO班 例外代码

  • 我有一个父类来处理我所有的自定义异常,父母异常。我希望所有的子异常都有一个方法来向异常添加消息。为了做到这一点,我创建了一个泛型方法,在向其添加消息后返回泛型类型的对象。我在父类方法中使用来添加消息,然后返回,但是由于该方法返回泛型类型,所以我将其转换为泛型类型T。这似乎是可行的,但是给出了警告。我的代码如下: 该行给出的警告是。这种方法似乎确实如预期的那样有效,所以我并不担心,但我想更好地理解为