java不能将类“X”强制转换为类“Y”,即使X扩展了Y?
出于某种原因,在第三个类Z
中,试图将一个类X
强制转换为另一个类Y
会抛出一个ClassCastException
。在我看来,这似乎是错误的,因为类X
扩展了另一个类Y
。类X
不能被强制转换为Y
,即使X
扩展了它,有什么具体原因吗
参考以下代码:
Y
:
public abstract class Y {
/**
* Called when the extension is enabled.
*/
public void onEnable() {
}
}
X
:
public class X extends Y {
@Override
public void onEnable() {
// Extension specific code.
}
}
Z
:(此代码是ClassCastException
源代码。)
public class Z {
private boolean loadExtension(ExtensionDescription description) {
try {
URLClassLoader loader = new ExtensionClassLoader(new URL[]{description.getFile().toURI().toURL()});
Y y = (Y) loader.loadClass(description.getMain()).newInstance();
} catch (Throwable t) {}
}
}
如果已知loader.loadClass(description.getMain()).newInstance();
会创建X
的新实例,那么为什么对Y
进行强制转换会导致ClassCastException
# 1 楼答案
为了进一步说明,这里有一个例子:
创建一个自定义的
ClassLoader
,例如下面(从here复制)下面是
Z
以下是输出: