序列化—为什么每次都使用前缀“java.io.”,而不导入java.io.serializable接口

zbwhf8kr  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(328)

我的问题不是关于理解可串行化接口用法的技术理解。这些答案已经解释过了[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; 在集合接口中完成。

iovurdzv

iovurdzv1#

这背后没有什么好的理由。这些类没有其他import语句和 Serializable 仅在这些文件中的一个位置引用,因此很容易理解作者为什么不希望导入。
作为另一个关注点, TreeMap 在openjdk8中,两者都包含import语句并使用完全限定名。

i34xakig

i34xakig2#

java导入就是这样工作的:
中的所有类和接口 java.lang 自动可见。
同一包中的任何类或接口都会自动对该包中的其他类和接口可见。
必须显式声明(package&classname)或导入另一个包中的任何类或接口。
根据这些规则: AbstractSet , NavigableSet 与…在同一个包裹里 TreeSet 因此自动可见。 Cloneablejava.lang 自动可见。 Serializablejava.io 并如此明确地声明(但也可以用于导入)。
在大多数情况下,在询问为什么要使用显式声明或导入时,这取决于样式。在大多数情况下,使用导入是因为它可以保持代码更干净。
唯一的例外是使用两个或多个同名的类或接口。在这种情况下,应该显式声明每个用法。

dy1byipe

dy1byipe3#

有一个接口 sunw.io.Serializable ,所以他们很可能想要区分这两个。然而,这是不可能说的实际原因是什么。也许是因为策略,也许是因为导入了错误的bug,他们遇到了难以调试的bug。。。

wbrvyc0a

wbrvyc0a4#

你提到的课程( TreeSet , LinkedHashSet 等等)没有任何导入,如果它属于包而不是其他包,则始终使用完整的类名 java.lang 或者 java.util 我想说这是一种不好的做法,但我们不能责怪乔希·布洛赫先生:)

相关问题