【问题标题】:Can I say "if class A is subclass of class B, type A must be subtype of type B"?我可以说“如果 A 类是 B 类的子类,那么 A 类必须是 B 类的子类”吗?
【发布时间】:2014-06-23 00:36:04
【问题描述】:

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

具体类(非泛型/高阶类)

如果我声明一些具体的类或类型,用 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] 的子类,对吧?

【问题讨论】:

  • Java 没有“类型”的概念,除了标量基元(不能子类型化)。
  • 我们不能像谈论 Scala 那样谈论 Java 的泛型。他们做事不同。选择一个。
  • @HotLicks 不正确;在 Java 中,类和接口都是类型。
  • @chrylis - 在这种情况下,“类”和“类型”本质上是同义词(标量除外),所以这个问题毫无意义。
  • @HotLicks 即使在 Java 中,“类”和“类型”也是不同的概念。接口是类型而不是类。 ArrayList<Integer> 是一个类型而不是一个类,即使 ArrayList 是一个类。

标签: java scala subclassing type-systems subtyping


【解决方案1】:

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

只有两种方式“A subclasses B”和“A subtypes B”可能不等价:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-01
    • 2017-07-06
    • 2021-08-25
    • 1970-01-01
    • 2015-01-01
    • 2017-12-28
    • 2021-11-14
    • 2013-09-07
    • 1970-01-01
    相关资源
    最近更新 更多