问题标签 [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.
java - 我们可以在 Java(或 Kotlin)中表示“自我类”吗?
我认为问题标题有点令人困惑,但我找不到更准确的说法。
我只需要一个简单的代码示例来告诉你我想要什么。
我有:
但实际上,这段代码也会编译(差异:查看返回类型声明):
我希望代码 2 是类型错误。
说,我想强制每个A
“子类”bla
方法返回自己,而不是A
.
我认为可以有一个假代码来代表我想要的:
就像 Haskell 的类型类:
这可能吗?
rust - Rust 子类型化/“运行时多态性”/在 Boxes 中使用特征
考虑以下简化的示例:
一个混凝土ThemePark
可以有任意一组景点,以及游客。它们是用结构实现的:
AThemePark
包含在某些公司的资产中,如下所示:
这开始了我的痛苦。我放ThemePark
了 aBox
因为我在编译时不知道它的大小。它可以包裹在任何类型的Attraction
and周围Visitor
。
ThemePark
需要 2 个类型参数,但我在编译时不知道它们。在我的代码中的某处,我从外部文件中读取了它并ThemePark
相应地构建了一个。
这个想法是,在运行时我可以ThemePark
从外部源创建一个,然后调用functions
它的特征中定义的。
我知道我不能将ThemePark
原样放在堆栈上......它的大小在编译时是未知的,所以编译器不知道要分配什么。
这就是为什么我要么使用引用,要么像我在这里所做&
的那样将其包装起来。Box
我知道有类型擦除,这意味着我只会返回 aThemePark
而不是 a SeriousThemePark
,但这暂时就足够了。
我在这里使用的特征都错了吗?你会怎么去解决这个问题。来自 Java/Scala/C++,我似乎在现有的思维中陷入了太深的困境。
ocaml - 多态变体子类型实现与签名不匹配
我有以下代码:
您可能会注意到,抽象类型'a t
在其类型参数中被声明为协变'a
,而make
构造函数被声明为返回多态变体 case或的子类型。a
b
在我的实现中make
,返回子类型[a] t
仍应遵循协方差规则,因为子类型位于返回类型位置。
但是,我收到以下错误:
关于如何让 OCaml 相信该make
函数确实返回了 的有效子类型的任何建议[a | b] t
?
kotlin - 任何可提升到“单位”的 λ 共域?
显然,这被类型检查器拒绝:
但是,这很好:
我可以理解:
由于Int <: Any
. 但是,它必须是不同的Unit
(它不是 的超类型Int
)。是否有一些文档解释发生了什么?
scala - Scala 是否有像 ML 这样的值限制,如果没有,那为什么?
这是我对这个问题的看法。任何人都可以确认、否认或详细说明吗?
我写道:
Scala 没有将协变与分配 给
List[A]
的 GLB ⊤统一起来,bcz afaics 在子类型化“biunification”</a> 中分配的方向很重要。因此必须有类型(即),同上类型不能分别接受来自or的赋值。因此,价值限制问题起源于无方向的统一,并且在最近的上述研究之前,全球双统一被认为是不可判定的。List[Int]
None
Option[⊥]
Option[Nothing]
Nil
List[Nothing]
Option[Int]
List[Int]
ML 的值限制将在(以前被认为是罕见但可能更普遍的)情况下不允许参数多态性,否则这样做是合理的(即类型安全),例如特别是对于 curried 函数的部分应用(这在函数式编程中很重要),因为替代类型解决方案在函数式编程和命令式编程之间创建了分层,并打破了模块化抽象类型的封装。Haskell 有一个类似的双重单态限制。OCaml 在某些情况下放宽了限制。我详细阐述了其中一些细节。
编辑:我在上面引用中表达的原始直觉(子类型可以消除值限制)是不正确的。IMO 的答案很好地阐明了问题,我无法确定包含 Alexey、Andreas 或我的集合中的哪个应该是选定的最佳答案。IMO 他们都是值得的。
scala - Option类型的子类型关系
Option
我最近对 scala 的子类型系统有所了解,并对类型及其子类型的关系产生了好奇。我了解到以下陈述是正确的。
如果 A <: B,则 (A => C) >: (B => C)
另外,我理解这A <: B
意味着存在一些B
不能是A
. 如果我将这些应用于Option
类型,那么我会得到以下结果。为方便起见,我将跳过ⱯA.
符号。
Nothing
<:Option[A]
,所以Option[A] => string
<:Nothing => string
- 我想不出任何实例
Nothing => string
不是 的实例Option[A] => string
,所以Nothing => string
<:Option[A] => string
Nothing => string
(<: 和 >:)Option[A] => string
,因此Nothing => string
实际上等于Option[A] => string
子类型化Option[A] => string
<:Some[A] => string
,所以Nothing => string
<:Some[A] => string
Some[A]
<:Nothing
由于我强烈怀疑结果是否正确,我认为中间出了点问题。谁能解释这里发生了什么?
java - 使用泛型:用泛型中的父值和子值实例化泛型类的对象
考试中的问题是:编写一个名为 Registration 的类,它可以存储 T 类型的变量,其中 T 可以替换为 String、Person、Student 等。应该可以按如下方式实例化 Registration:
我无法弄清楚如何为类头的泛型部分编写声明。下面我给出了注册类。需要注意的是,Student 类继承了 Person 类。
**取自 Uoft CSC207 Aug2017 考试
signature - 子集块(或一般的可调用对象)
这个问题最初是由lookatme
Perl6 IRC 频道发布的。最初的意图是通过使用子集或任何其他可能的方式来约束 Callable 。它适用于签名,但是:
返回
声明的其他变体返回类似的消息。什么是正确的语法?
ada - 赋值是 Ada 中派生类型和子类型之间的唯一区别吗?
我读过派生类型与它们各自的父类型是完全不同的类型,但是它们确实继承了它们所有父级的操作。
换句话说,您可以将派生类型传递A
给一个操作,该操作接收一个作为参数的类型,该类型B
是A
的父类型。但是,您不能将类型变量分配给类型A
之一,B
反之亦然。
根据上述,派生类型和子类型之间的唯一区别是赋值。那正确吗?