下面的代码引发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");
}
}
请帮助我理解这一点,以及如何解决这个问题。
编译器根据方法重载解析选择的A()
方法推断al.Makeparent()
返回的类型。
由于方法重载解析首先考虑没有vararg参数的候选项,因此只考虑公共空a(list
重载,因此这就是所选的重载。
public void a(列表
可以接受返回r扩展parenti
的方法的返回值作为其参数的原因是,可能存在一个扩展parenti
并实现list
的类。
一旦选择了public void a(list
重载,则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的对象。 不过