问题标签 [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.
type-theory - 子类型和包含有什么区别?
子类型和包含有什么区别?包容是否意味着隐性强制?
c++ - 覆盖运算符以使用 C++ 中的派生类
我试图覆盖子类中的虚拟比较运算符,但我收到编译器错误,说派生类没有实现基类的虚拟运算符。
我感觉这与我的派生运算符不使用基类的参数类型有关。
一个简化的版本如下:
我有办法做到这一点,还是我必须在Derived
实现中进行类型检查以查看它是否是正确的类型?
covariance - Eiffel:协变非法类型作为参数传递?
(强调我的)
但是,如果重新定义字段和函数类型协变没有问题,那么重新定义参数的类型协变怎么会导致麻烦呢?
协变重新定义等于子类型化,对吧?子类型可以代替它们的超类型!
有什么问题?
scala - Scala通用列表添加
我有功能:
上面的代码示例工作正常,但是当我更改为下面的函数时,它停止工作并出现错误
找不到参数的隐式值
abc: Numeric[AnyVal]
既然AnyVal
是我可以添加的基本类型,不是吗?
所有隐含定义在哪里?
这也不起作用,我认为出于同样的原因。
c++ - 如何在子类型上调用函数?
我目前正在设计一种编程语言,我很好奇如何解决这个问题:
假设我有一个如下所示的类(或接口)A:
和第二个 B 类扩展它,看起来像这样:
并且我有一个看起来像这样的函数 f:
但是,如果我用两个 B 调用它,则 second.a 不会与用两个 As 调用它位于同一位置,因为第一个参数会移动它。我目前解决这个问题的想法是:
- 不允许未知大小的参数,并强制它作为指针或引用传递(我认为这就是 Rust 所做的)
- 将以下所有信息写入调用堆栈:指向第二个的指针、指向第二个之后的指针、非可变大小参数、第一、第二
- 为 first 和 second 的每个可能大小创建一个函数,并确定在编译时(如果已知)或在运行时使用 vtables 调用哪个函数。
第二个想法将是一个问题,因为它需要得到所有函数的支持,即使它们很少或从不使用子类型调用,这是低效的。
第三个想法需要创建很多函数(一个接受 5 个参数的函数,这些参数可以是 20 种不同的子类型,如果只调用一个具有未知类型参数的函数,则需要生成 100 段类似的代码),并且对于只有一个函数使用它的每个类,都需要一个 vtable。此外,已编译库中的函数不能与新子类型一起使用。
结合 2 和 3 并创建相同函数的两个版本,一个只接受类型,另一个也接受子类型可以解决其中一些问题。
我很好奇是否有更好的解决方案,以及 C++ 等其他语言如何实现这一点。
ios - 调用了错误的通用重载函数
我试图理解为什么泛型方法的 where 子句被忽略
我在 Swift 3 中做了一个简单的用例(如果你想摆弄它,你可以在操场上复制代码):
好的,现在让我们运行一些测试。如果我们有:
输出是:
嗯......显然,为了使where
协议子句起作用,我们需要传递一个符合其定义中协议的强类型。
仅使用超类型是不够的,即使在测试#3 中很明显给定实例实际上符合HasChildren
协议。
那么,我在这里缺少什么,这是不可能的吗?您是否有一些链接可以提供有关正在发生的事情的更多信息,或者有关where
子句或子类型及其一般行为的更多信息?
我已经阅读了一些有用的资源,但似乎没有一个关于它为什么不起作用的详尽解释:
scala - Scala 中的子类型化
我创建了一个扩展到 Counter 的类,它跟踪加法和减法。我试图调用 xs,然后返回 xs 在实例上调用的数字上升或下降的总和,它正在编译但它失败了。
谢谢大家,我真的可以通过了。我需要创建另一个变量来跟踪我的增量和减量,然后在 def inc 和 def dec 中,我将添加到 count 的 add 或减去 :)
ocaml - Ocaml 通过与值的接近程度来消除推断类型的歧义?
ocaml 顶级(4.01.0)推断intersect1
as的类型small1
。我以为我明白了原因:small1
看起来像是large1
.
但现在:
顶层现在推断出一种large2
for intersect2
。这使它看起来像接近被用作决胜局,但这非常令人惊讶,并且与我使用的其他语言不同,所以我怀疑这里有一些微妙的东西我误解了。
一个并发症:正如激发这个问题的答案的问题所指出的那样,“更接近”的类型并没有完全隐藏更远的类型。
zell
被赋予类型left -> right
。
推断这些类型的具体规则是什么?在手册(或任何其他已发表的论文或文档)中我可以在哪里阅读更多信息?