我的问题不是关于理解可串行化接口用法的技术理解。这些答案已经解释过了[1]、[2]等等
我的问题是从句法的Angular 提出的。
在查看collection接口及其子接口的源代码时,我注意到大多数接口都实现了 Cloneable
以及 java.io.Serializable
如下图所示:
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable{
...
}
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
...
}
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
...
}
……等等
我还注意到: Collection
接口,
TreeSet LinkedHashSet
等属于
package java.util; Cloneable
接口属于
package java.lang; Serializable
属于 package java.io;
现在我的问题是为什么要加前缀 java.io
之前 Serializable
(如上所示)而不是导入 import java.io.Serializable;
在集合接口中完成。
4条答案
按热度按时间iovurdzv1#
这背后没有什么好的理由。这些类没有其他import语句和
Serializable
仅在这些文件中的一个位置引用,因此很容易理解作者为什么不希望导入。作为另一个关注点,
TreeMap
在openjdk8中,两者都包含import语句并使用完全限定名。i34xakig2#
java导入就是这样工作的:
中的所有类和接口
java.lang
自动可见。同一包中的任何类或接口都会自动对该包中的其他类和接口可见。
必须显式声明(package&classname)或导入另一个包中的任何类或接口。
根据这些规则:
AbstractSet
,NavigableSet
与…在同一个包裹里TreeSet
因此自动可见。Cloneable
在java.lang
自动可见。Serializable
在java.io
并如此明确地声明(但也可以用于导入)。在大多数情况下,在询问为什么要使用显式声明或导入时,这取决于样式。在大多数情况下,使用导入是因为它可以保持代码更干净。
唯一的例外是使用两个或多个同名的类或接口。在这种情况下,应该显式声明每个用法。
dy1byipe3#
有一个接口
sunw.io.Serializable
,所以他们很可能想要区分这两个。然而,这是不可能说的实际原因是什么。也许是因为策略,也许是因为导入了错误的bug,他们遇到了难以调试的bug。。。wbrvyc0a4#
你提到的课程(
TreeSet
,LinkedHashSet
等等)没有任何导入,如果它属于包而不是其他包,则始终使用完整的类名java.lang
或者java.util
我想说这是一种不好的做法,但我们不能责怪乔希·布洛赫先生:)