为什么Java的可克隆接口不是通用的?

2022-09-03 09:09:30

Java 5 引入了泛型,它们被添加到包中的许多接口中。但是,没有得到泛型。我想知道为什么?java.langCloneable


编辑:在回答@Jon和@litb的回答以及@Earwicker的评论时,我想可能是:Cloneable

public interface Cloneable<T> {
    public T clone();
}

这里覆盖,给它一个协变类型。我相信这仍然是向后兼容的,并提高类型安全性。那么为什么不呢?T clone();Object.clone()


编辑 2:从下面的答案(和评论)中可以看出,上面建议的界面会破坏向后兼容性。因为 is ,在接口中重写它将迫使所有实现者提供一个实现,类设计人员可能不希望这样做(即他们可能会选择保留它)。Object.clone()protectedpublicprotected


答案 1

可克隆接口不包含任何成员。让它变得通用有什么意义?

(如果 Cloneable 包含 clone() 方法,那将有意义 - 但这是在 java.lang.Object 中声明的。

编辑:clone()在java.lang.Object中,因为它有一个实现(执行逐个字段的复制)。更好的设计是拥有类似.NET 的 MemberwiseClone() 作为 Object 中的受保护方法,然后在接口本身中作为公共 clone() 方法。我不知道为什么没有选择这个设计。

(在 .NET 中,ICloneable 不是泛型的,因为它存在于泛型之前 - .NET 泛型的不同性质阻止了以前非泛型类型成为泛型。

然而,在Java和.NET中,“正常”的克隆API通常被认为是一件坏事,因为它没有提到应该执行多深的克隆。


答案 2

如果 是 ,则不可能这样做:CloneableCloneable<T>

class A extends B implements Cloneable<A>

class B implements Cloneable<B>

不能使用不同的参数实现同一接口,而类实现 和 。ACloneable<A>Cloneable<B>


推荐