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