[ClassCastException in Inheritance-Why?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ClassCastException in Inheritance-Why?相关的知识,希望对你有一定的参考价值。

以下代码抛出ClassCastException

线程“主”中的异常java.lang.ClassCastException:类Child不能强制转换为类java.util.List(子级位于加载程序“ app”; java.util.List在加载程序的模块java.base中Test.main(Test.java:20)]中的“ bootstrap”)

以退出代码1完成的过程

我真的不确定为什么会这样。我想我写的是正确的代码。

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");
    }
}

请帮助我理解这一点以及如何解决。

<< [

编译器根据方法重载分辨率选择的al.makeParent()方法,推断a()返回的类型。
由于方法重载解决方案首先考虑没有vararg参数的候选者,因此仅考虑public void a(List<ParentI> ss)重载,因此这就是选择的重载。
public void a(List<ParentI> ss)可以接受返回R extends ParentI的方法的返回值作为其参数的原因是,可能存在扩展ParentI并实现List<ParentI>的类。

一旦选择了public void a(List<ParentI> ss),则在return (R) ai;中进行强制转换会导致尝试将Child强制转换为List,但在运行时会失败。

虽然我不知道为什么会引发异常。我设法编辑了代码,以便程序成功运行。 makeParent()方法需要修改,因此不通用:

public ParentI makeParent() { ParentI ai = new Child(); return ai; }
基本上与以前相同。

然后,调用正确的重载a()

这是因为您正在使用变量参数和列表,

public void a(ParentI ... ss){}
public void a(List ss){}

在运行时,它试图将返回对象从al.makeParent()传递到List方法,并且无法转换Child无法转换为java.util.List。>

答案
public void a(List<ParentI> ss)可以接受返回R extends ParentI的方法的返回值作为其参数的原因是,可能存在扩展ParentI并实现List<ParentI>的类。
另一答案
None
另一答案
None

以上是关于[ClassCastException in Inheritance-Why?的主要内容,如果未能解决你的问题,请参考以下文章

Exception in thread "main" java.lang.ClassCastException

Exception in thread "main" java.lang.ClassCastException: $Proxy13

Exception in thread "main" java.lang.ClassCastException: $Proxy13

2类型转换异常:Exception in thread "main" java.lang.ClassCastException:java.lang.Object cannot be

如何在clojure中读取stdin(* in *)中的行

HQL 或 Java 持久性查询语言中的 IN 子句