当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么Java的可克隆接口不是通用的?》经验,为你挑选了3个好方法。

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


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

public interface Cloneable {
    public T clone();
}

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


编辑2:从下面的答案(和评论)中可以看出,上面建议的界面会破坏向后兼容性.由于Object.clone()IS protected,在接口重写它会迫使所有的实施者提供了一个public实现,类的设计者可能不希望(即它们可能会选择保留它protected).



1> Jon Skeet..:

Cloneable接口不包含任何成员.使其成为通用的重点是什么?

(如果Cloneable包含clone()方法,那么它会有意义 - 但是在java.lang.Object中声明了.)

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

(在.NET中,ICloneable不是通用的,因为它在泛型之前存在 - .NET泛型的不同性质阻止了以前的非泛型类型变得通用.)

然而,在Java和.NET中,"普通"克隆API通常被认为是一件坏事,因为它没有说明应该执行什么样的克隆深度.



2> 小智..:

如果CloneableCloneable,那么就不可能这样做:

class A extends B implements Cloneable

class B implements Cloneable

您不能使用不同的参数和类A实现Cloneable和实现相同的接口Cloneable.



3> Johannes Sch..:

java.lang.Cloneable是一个标记界面.它仅用于此目的,以便Object.clone可以抛出一个异常来表示一个类不支持克隆,例如使用

if(!(this instanceof Cloneable))
    throw...;

从文档:

类Object的方法clone执行特定的克隆操作.首先,如果此对象的类未实现Cloneable接口,则抛出CloneNotSupportedException.

它没有方法.使它成为通用不会有任何用处.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有