0

如果你实现了一个接口,编译器会要求你提供这些方法的实现。Cloneable但是在调用覆盖的 clone() 方法的情况下,编译器如何知道在类声明中没有提到特定的接口(在这种情况下)。编译器如何将此映射告诉用户 CloneNotSupported ?它与后期绑定有关吗?

我认为 JVM 有关于方法区域中每个类的信息,比如它正在扩展什么类以及它正在实现什么接口。所以调用 clone() 方法将检查那些存储的关于类的元数据,并发现它Cloneable不在那个接口列表中?这是接近正确答案的地方吗?

4

1 回答 1

3

你说对了。基本上,该Object.clone()方法执行以下操作:

if (!(this instanceof Cloneable)) {
    throw new CloneNotSupportedException(); 
}

javadoc对此进行了解释:

首先,如果该对象的类没有实现接口 Cloneable,则抛出 CloneNotSupportedException。

请注意,编译器与此无关。这一切都发生在运行时。

于 2012-05-22T07:31:42.003 回答