在Java库中,Collection
接口不扩展Cloneable
和Serializable
接口的原因是什么?
答案 0 :(得分:19)
Collection
是一个接口,用于指定一组称为元素的对象。如何维护元素组的细节取决于Collection
的具体实现。例如,某些Collection
实现(如List
)允许重复元素,而其他实现(如Set
则不允许。很多Collection
实现都有一个公共clone
方法。但是,将它包含在Collection
的所有实现中并不合理。这是因为Collection
是一个抽象表示。重要的是实施。在处理实际实现时,克隆或序列化的语义和含义发挥作用;也就是说,具体的实现应该决定它应该如何被克隆或序列化,甚至如果它可以被克隆或序列化。在某些情况下,根据实际的后备实现,克隆和序列化可能没有多大意义。因此,在所有实现中强制克隆和序列化实际上不那么灵活且限制性更强。具体实施应该决定是否可以克隆或序列化。
以下是Oracle文档中的explanation:
许多集合实现(包括由...提供的所有集合) JDK)将有一个公共克隆方法,但它将是错误的 要求所有收藏品。例如,克隆是什么意思 一个由TB级SQL数据库支持的集合?应该的 方法调用导致公司申请新的磁盘场?类似 参数持有可序列化。
如果客户端不知道Collection的实际类型,那就太多了 更灵活,更不容易出错,让客户决定使用哪种类型 需要Collection,创建一个这种类型的空集合,和 使用addAll方法复制原始集合的元素 进入新的。
答案 1 :(得分:8)
因为如果确实如此,那么所有Collection
实施都需要Cloneable
和Serializable
,这比实际情况更具限制性。 实现经常也会实现这些接口,但Collection
接口不需要它。