我可以说"如果A类是B类的子类,A类必须是B类型的子类型"?

时间:2014-06-23 00:36:05

标签: java scala subclassing type-systems subtyping

我对subtypesubclass之间的关系有所了解,但我不确定它们是否正确。

具体类(非通用/高阶类)

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

class B

class A extends B

如果类A是类B的子类,那么类型A必须是B类型的子类型?

而且,如果类型A是类型B的子类型,那么类A是类B的子类? (假设AB都是类)

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

高阶类/类型

但对于高阶类型,这不正确,对吧?说:

class A[+T]

然后输入A[String]A[Object]类型的子类型,但A[String]不是A[Object]的子类,对吗?

1 个答案:

答案 0 :(得分:3)

对于问题中的所有内容几乎都是 - 您可以将AB描述为子类型,即使它们是泛型类,我将在下面解释。

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

1,Traits / interfaces可以是继承层次结构的一部分,但不能描述为类,因此不能成为子类关系的一部分。您可以使用“extends”来表达这种更一般的关系,例如A扩展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]和两种A以及BA个子类型B,那么C[B, A]个子类型C[A, B],但很明显那里没有子类关系。