public void a(List<ParentI> ss)
可以接受返回R extends ParentI
的方法的返回值作为其参数的原因是,可能存在扩展ParentI
并实现List<ParentI>
的类。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()
返回的类型。 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>
的类。以上是关于[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