33

为什么接口中没有.clone()指定方法java.lang.Cloneable

4

5 回答 5

36

基本上,这是一个损坏的界面。Ken Arnold 和 Bill Venners 在Java Design Issues中讨论了它。

阿诺德:

如果我在这一点上成为上帝,而很多人可能很高兴我不是,我会说 deprecateCloneable并且有一个Copyable, 因为Cloneable有问题。除了拼写错误之外,Cloneable不包含该clone方法。这意味着您无法测试某物是否是 的实例Cloneable,将其强制转换为Cloneable并调用clone。您必须再次使用反射,这很糟糕。这只是一个问题,但我肯定会解决一个问题。

于 2009-04-02T12:05:52.640 回答
10

在 Java 错误数据库中查看此错误:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033

从本质上讲,这是 Java 早期版本中的一个设计缺陷,他们不打算在 Cloneable 接口中修复,因为这样做会破坏与某些现有代码的兼容性。

于 2009-04-02T11:56:55.093 回答
6

在 Java 中,有标记接口的概念。该Cloneable接口没有方法或字段,仅用于识别可克隆的语义。

来自dev-x网站:

您经常会在 Java 中遇到没有行为的接口。换句话说,它们只是空的接口定义。这些被称为标记接口。Java API 中的一些标记接口示例包括:

于 2009-04-02T12:03:20.477 回答
5

在我从事的项目中,我们创建了一个名为 PublicCloneable 的接口,它包含 clone 方法并指定它是公共的。

我发现这个很有用:有一个克隆方法,但您无法访问它并没有多大帮助。

public interface PublicCloneable extends Cloneable {
    public Object clone();
}
于 2009-04-02T12:35:23.193 回答
1

因为 clone 方法是在 Object 类中实现的,因为它的“特殊”条件是:任何类型的对象的内存副本。

于 2009-04-02T11:57:11.490 回答