我对subtype
和subclass
之间的关系有所了解,但我不确定它们是否正确。
在Java或Scala中说,如果我声明一些具体的类或类型:
class B
class A extends B
如果类A
是类B
的子类,那么类型A
必须是B
类型的子类型?
而且,如果类型A
是类型B
的子类型,那么类A
是类B
的子类? (假设A
和B
都是类)
但只有当它是具体的类或类型时它们才是真的
但对于高阶类型,这不正确,对吧?说:
class A[+T]
然后输入A[String]
是A[Object]
类型的子类型,但A[String]
不是A[Object]
的子类,对吗?
答案 0 :(得分:3)
对于问题中的所有内容几乎都是 - 您可以将A
和B
描述为子类型,即使它们是泛型类,我将在下面解释。
“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
以及B
和A
个子类型B
,那么C[B, A]
个子类型C[A, B]
,但很明显那里没有子类关系。