问题标签 [subtyping]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
183 浏览

java - 我们可以在 Java(或 Kotlin)中表示“自我类”吗?

我认为问题标题有点令人困惑,但我找不到更准确的说法。
我只需要一个简单的代码示例来告诉你我想要什么。

我有:

但实际上,这段代码也会编译(差异:查看返回类型声明):

我希望代码 2 是类型错误。
说,我想强制每个A“子类”bla方法返回自己,而不是A.

我认为可以有一个假代码来代表我想要的:

就像 Haskell 的类型类:

这可能吗?

0 投票
1 回答
1414 浏览

rust - Rust 子类型化/“运行时多态性”/在 Boxes 中使用特征

考虑以下简化的示例:

一个混凝土ThemePark可以有任意一组景点,以及游客。它们是用结构实现的:

AThemePark包含在某些公司的资产中,如下所示:

这开始了我的痛苦。我放ThemePark了 aBox因为我在编译时不知道它的大小。它可以包裹在任何类型的Attractionand周围Visitor

ThemePark需要 2 个类型参数,但我在编译时不知道它们。在我的代码中的某处,我从外部文件中读取了它并ThemePark相应地构建了一个。

这个想法是,在运行时我可以ThemePark从外部源创建一个,然后调用functions它的特征中定义的。

我知道我不能将ThemePark原样放在堆栈上......它的大小在编译时是未知的,所以编译器不知道要分配什么。

这就是为什么我要么使用引用,要么像我在这里所做&的那样将其包装起来。Box

我知道有类型擦除,这意味着我只会返回 aThemePark而不是 a SeriousThemePark,但这暂时就足够了。

我在这里使用的特征都错了吗?你会怎么去解决这个问题。来自 Java/Scala/C++,我似乎在现有的思维中陷入了太深的困境。

0 投票
1 回答
429 浏览

ocaml - 多态变体子类型实现与签名不匹配

我有以下代码:

您可能会注意到,抽象类型'a t在其类型参数中被声明为协变'a,而make构造函数被声明为返回多态变体 case或的子类型ab

在我的实现中make,返回子类型[a] t仍应遵循协方差规则,因为子类型位于返回类型位置。

但是,我收到以下错误:

关于如何让 OCaml 相信该make函数确实返回了 的有效子类型的任何建议[a | b] t

0 投票
2 回答
75 浏览

kotlin - 任何可提升到“单位”的 λ 共域?

显然,这被类型检查器拒绝:

但是,这很好:

我可以理解:

由于Int <: Any. 但是,它必须是不同的Unit(它不是 的超类型Int)。是否有一些文档解释发生了什么?

0 投票
3 回答
428 浏览

scala - Scala 是否有像 ML 这样的值限制,如果没有,那为什么?

这是我对这个问题的看法。任何人都可以确认、否认或详细说明吗?

写道

Scala 没有将协变与分配 List[A]的 GLB ⊤统一起来,bcz afaics 在子类型化“biunification”</a> 中分配的方向很重要。因此必须有类型(即),同上类型不能分别接受来自or的赋值因此,价值限制问题起源于无方向的统一,并且在最近的上述研究之前,全球双统一被认为是不可判定的。 List[Int]NoneOption[⊥]Option[Nothing]NilList[Nothing]Option[Int]List[Int]

您可能希望查看上述评论的上下文。

ML 的值限制将在(以前被认为是罕见但可能更普遍的)情况下不允许参数多态性,否则这样做是合理的(即类型安全),例如特别是对于 curried 函数的部分应用(这在函数式编程中很重要),因为替代类型解决方案在函数式编程和命令式编程之间创建了分层,并打破了模块化抽象类型的封装。Haskell 有一个类似的双重单态限制。OCaml 在某些情况下放宽了限制。我详细阐述了其中一些细节。

编辑:我在上面引用中表达的原始直觉(子类型可以消除值限制)是不正确的。IMO 的答案很好地阐明了问题,我无法确定包含 Alexey、Andreas 或我的集合中的哪个应该是选定的最佳答案。IMO 他们都是值得的。

0 投票
2 回答
472 浏览

scala - Option类型的子类型关系

Option我最近对 ​​scala 的子类型系统有所了解,并对类型及其子类型的关系产生了好奇。我了解到以下陈述是正确的。

如果 A <: B,则 (A => C) >: (B => C)

另外,我理解这A <: B意味着存在一些B不能是A. 如果我将这些应用于Option类型,那么我会得到以下结果。为方便起见,我将跳过ⱯA.符号。

  1. Nothing<: Option[A],所以Option[A] => string<:Nothing => string
  2. 我想不出任何实例Nothing => string不是 的实例Option[A] => string,所以Nothing => string<:Option[A] => string
  3. Nothing => string(<: 和 >:) Option[A] => string,因此Nothing => string实际上等于Option[A] => string子类型化
  4. Option[A] => string<: Some[A] => string,所以Nothing => string<:Some[A] => string
  5. Some[A]<:Nothing

由于我强烈怀疑结果是否正确,我认为中间出了点问题。谁能解释这里发生了什么?

0 投票
3 回答
67 浏览

java - 使用泛型:用泛型中的父值和子值实例化泛型类的对象

考试中的问题是:编写一个名为 Registration 的类,它可以存储 T 类型的变量,其中 T 可以替换为 String、Person、Student 等。应该可以按如下方式实例化 Registration:

我无法弄清楚如何为类头的泛型部分编写声明。下面我给出了注册类。需要注意的是,Student 类继承了 Person 类。

**取自 Uoft CSC207 Aug2017 考试

0 投票
2 回答
104 浏览

signature - 子集块(或一般的可调用对象)

这个问题最初是由lookatmePerl6 IRC 频道发布的。最初的意图是通过使用子集或任何其他可能的方式来约束 Callable 。它适用于签名,但是:

返回

声明的其他变体返回类似的消息。什么是正确的语法?

0 投票
1 回答
139 浏览

ada - 赋值是 Ada 中派生类型和子类型之间的唯一区别吗?

我读过派生类型与它们各自的父类型是完全不同的类型,但是它们确实继承了它们所有父级的操作。

换句话说,您可以将派生类型传递A给一个操作,该操作接收一个作为参数的类型,该类型BA的父类型。但是,您不能将类型变量分配给类型A之一,B反之亦然。

根据上述,派生类型和子类型之间的唯一区别是赋值。那正确吗?

0 投票
2 回答
728 浏览

kotlin - 在 Nothing 上调用任何方法

尽管没有明确说明Nothing 是所有类型的子类型,但这(除其他外)表明:

但是,这会因“未解决的引用”而失败:

这是错误还是功能?

笔记:

  1. 第一段代码编译(带有警告),第二段没有
  2. 可以使用Nothing类型化的接收器,例如调用toString()
  3. 这是合法的:{b:Boolean -> b.not()}(q)
  4. 也上调:(q as Boolean).not()
  5. Scala的等效问题