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

继承中的ClassCastException-为什么?

乐成济
2023-03-14

下面的代码引发ClassCastException:

线程“main”java.lang.ClassCastException中的异常:不能将类子级转换为类java.util.List(子级位于加载器“app”的未命名模块中;java.util.List位于加载器“bootstrap”的模块java.base中)

我真的不知道它为什么会这样做。我想我写的代码是正确的。

public class Test {
    public void a(ParentI... ss) {
    }

    public void a(List<ParentI> ss) {
    }


    public <R extends ParentI> R makeParent() {
        ParentI ai = new Child();
        return (R) ai;
    }

    public static void main(String[] args) {
        Test al = new Test();
        al.a(al.makeParent());
    }
}


interface ParentI {
    public void a();
}

class Parent implements ParentI {
    public void a() {
        System.out.println("Parent");
    }
}

class Child extends Parent {
    public void a(int t) {
        System.out.println("child");
    }
}

请帮助我理解这一点,以及如何解决这个问题。

共有1个答案

羊光辉
2023-03-14

编译器根据方法重载解析选择的A()方法推断al.Makeparent()返回的类型。

由于方法重载解析首先考虑没有vararg参数的候选项,因此只考虑公共空a(list ss) 重载,因此这就是所选的重载。

public void a(列表 ss) 可以接受返回r扩展parenti的方法的返回值作为其参数的原因是,可能存在一个扩展parenti并实现list 的类。

一旦选择了public void a(list ss) 重载,则return(R)ai;中的强制转换将导致尝试将实例强制转换为list,但在运行时失败。

例如,如果将子类定义更改为:

class Child extends Parent implements List<ParentI>

您的代码将毫无例外地运行。

 类似资料:
  • 问题内容: 给定以下代码,我有一个问题: 我的问题是粗体字。我的理解是,对于要编译的代码,只需要满足这些类处于相同的层次结构中,并因此可以起作用即可(在树上隐式强制转换,在树上隐式强制转换)。每当我遇到ClassCastException时,是因为引用指向树上的一个对象,例如,指向B类型的对象的B类型的引用。 问题所在的行似乎是指向类型A的对象的类型A的引用。强制转换为(B)显然是导致ClassC

  • 本文向大家介绍JavaScript中的继承之类继承,包括了JavaScript中的继承之类继承的使用技巧和注意事项,需要的朋友参考一下 继承简介       在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。在JS中想要达到继承公用成员的目的,需要采取一系列措施。JS属于原型式继承,得益于这种灵活性,我们既可以

  • 问题内容: 为什么以下代码不起作用(Python 2.5.2)? 我想创建一个类似的类,但具有不同的功能。显然我的函数永远不会被调用。而是调用原始文件并失败,因为它需要3个参数,而我传入了一个。 这里发生了什么?这是一个线索吗? 谢谢! 问题答案: 关于其他几个答案,这与用C本身实现的日期无关。该方法不做任何事情,因为它们是 不可变的 对象,因此构造函数()应该完成所有工作。您会看到相同的行为将i

  • 本文向大家介绍Python中的pathlib.Path为什么不继承str详解,包括了Python中的pathlib.Path为什么不继承str详解的使用技巧和注意事项,需要的朋友参考一下 起步 既然所有路径都可以表示为字符串,为什么 pathlib.Path 不继承 str ? 这个想法的提出在 https://mail.python.org/pipermail//python-ideas/201

  • 因此,我正在Ubuntu 14.04机器上将所有工具从python2迁移到python3.4。到目前为止,我已经完成了以下工作: 仅针对我的用户,在我的zshrc中将python别名为python3 在系统本身上安装了pip3(但无论如何我都会使用VirtualNVS,所以我不会真正使用它) 将我的VirtualNVRapper“make”别名更改为('workon'在下面被调用为'v') 奇怪的

  • 问题内容: 我是Java编程语言的初学者,最近我研究了 构造函数 不能在Java中继承,有人可以解释 为什么 吗? 问题答案: 简而言之,构造函数不能被继承,因为在子类中它具有​​不同的名称(子类的名称)。 您只能执行以下操作: 相反,方法是使用“相同名称”继承的,可以使用。 理由如下:继承构造函数没有多大意义,因为类A的构造函数意味着创建类型A的对象,而类B的构造函数意味着创建类B的对象。 不过