1

subtype我对和之间的关系有一些了解subclass,但我不确定它们是否正确。

具体类(不是通用/高阶类)

如果我声明一些具体的类或类型,用 Java 或 Scala 说:

class B

class A extends B

如果 classA是 class 的子类B,那么 typeA必须是 type 的子类型B

而且,如果 typeA是 type 的子类型B,那么 classA是 class 的子类B吗?(假设A并且B都是类)

但只有当它是具体的类或类型时它们才是真的

高阶类/类型

但是对于高阶类型,这不是真的,对吧?说:

class A[+T]

那么 typeA[String]是 type 的子类型A[Object],但A[String]不是 的子类A[Object],对吧?

4

1 回答 1

3

对问题中的所有内容几乎都是肯定的 -即使它们是泛型类,您也可以将其描述为子类型,正如我在下面解释的那样AB

只有两种方式“A子类B”和“A子类型B”可能不等价:

1,特征/接口可以是继承层次结构的一部分,但不能被描述为类,因此不能是子类关系的一部分。您可以使用“扩展”来表达这种更一般的关系,如Aextends B

2、泛型类不是简单类型,而是类型构造函数(即更高种类的类型)。所以:

class B[T]
class A[T] extends B[T]

说“A[T]子类型B[T]”但不是类A[T]并且B[T]不能具有子类关系是正确的。说“A子类B”和“A子类型B”是正确的,但在这种情况下,您描述的是高级类型之间的关系。

请注意,与 Java 不同,Scala 允许将类型参数声明为协变或逆变。如果你有class C[-T, +U]and 两种类型Aand BandAsubtypes B,那么C[B, A]subtypes C[A, B],但显然那里没有子类关系。

于 2014-06-23T01:43:43.220 回答