java子类型关系

java子类型关系,java,subtype,Java,Subtype,在阅读时,我遇到了关于Java中的子类型关系: S is a subtype of T if: S is an array type and T is Cloneable or Serializable 我无法真正理解这意味着什么。有人能帮忙吗 谢谢 这是一个简单的子类型示例 Array类型实现了Cloneable和Serializable接口 但是,这些接口没有指定任何方法作为方法契约的一部分。事实上,这些只是标记接口,它们的存在为类的编译器和用户提供了详细信息,而不直接需要任何功能 例

在阅读时,我遇到了关于Java中的子类型关系:

S is a subtype of T if: 

S is an array type and T is Cloneable or Serializable
我无法真正理解这意味着什么。有人能帮忙吗


谢谢

这是一个简单的子类型示例

Array
类型实现了
Cloneable
Serializable
接口

但是,这些接口没有指定任何方法作为方法契约的一部分。事实上,这些只是标记接口,它们的存在为类的编译器和用户提供了详细信息,而不直接需要任何功能

例如:

请注意,此接口不包含克隆方法。因此,仅仅因为对象实现了该接口,就不可能克隆对象。即使以反射方式调用clone方法,也不能保证它会成功


我认为引起您混淆的是“可克隆”和“可序列化”是英语中的属性,而短语“is
cloneable
”通常用于表示类实现了
cloneable
接口。然而,在这里,它们仅准确地表示接口名称
Cloneable
Serializable
,并且“is”应理解为“is确切地/等于”。也就是说,如果
T
是接口
Cloneable
或者
T
是接口
Serializable
,那么任何数组类型都是
T
的子类型

数组类型
是形式为
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
那么以下是合法的:

Cloneable x = a; x = b; x = c;
Serializable y = a; y = b; y = c;

我觉得你没有给我们所有的信息需要更多的上下文,T是相同的类型S和T都是类类型,T是S的直接或间接超类S是类类型,T是接口类型,S或它的超类实现T和T都是接口类型,T是S的直接或间接超接口,T都是数组类型,S的组件类型是T的子类型。T的组件类型不是基元类型,T是类型对象。S是空类型,T不是基元类型。这些是子类型关系的其他示例。有帮助吗?我熟悉这些接口。但是,如果存在子类型关系,我可以为实现可克隆或可序列化的类分配任何数组类型吗?@ErcanOzturk实际上可能没有,因为
java.lang.reflect.array
没有实现这些接口,因此,你问题中的陈述在这一点上是不真实的。那么我如何使用这个子类型关系呢?我们只是在说“存在”子类型关系吗?@ErcanOzturk没有。你原来的帖子在引用的开头给出了一个错误的假设。