在阅读Horstmann's book时,我在Java中遇到过关于子类型关系的问题:
S is a subtype of T if:
S is an array type and T is Cloneable or Serializable
我无法真正理解这应该是什么意思。有人可以帮忙吗?
谢谢!
答案 0 :(得分:0)
这是一个简单的子类型示例。
Array
类型实现Cloneable
和Serializable
接口。
但是,这些接口未指定任何方法作为方法合同的一部分。实际上,这些只是标记接口,它们的存在为编译器和类的用户提供了详细信息,而不需要任何功能。
例如:
请注意,此接口不包含克隆方法。因此,仅仅通过实现该接口的事实来克隆对象是不可能的。即使反射调用clone方法,也无法保证它会成功。
答案 1 :(得分:0)
我认为导致您混淆的是“可复制”和“可序列化”是英语中的属性,短语“is Cloneable
”通常用于表示类实现{{1接口。但是,这里只有 表示接口名称Cloneable
和Cloneable
,而“is”应理解为“is 完全 / equals ”。也就是说,如果Serializable
是接口T
或Cloneable
是接口T
,那么任何数组类型都是Serializable
的子类型。
T
是array type
形式的任何类型,其中U[]
是任意类型,即非U
基元或引用类型(请注意数组类型,即使是基本类型,也是引用类型)。这与类void
无关,这是不数组类型!
您不能将任何数组分配给实现java.lang.reflect.Array
或Cloneable
的类的引用变量,而只能分配给的引用变量类型Serializable
或Cloneable
。因此,如果你有
Serializable
然后以下是合法的:
int[] a = ...; // primitive array
Object[] b = ...; // reference type array
int[][] c = ...; // reference type array, since int[] is a reference type