- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设在 Scala repl 中做了以下声明:
class Animal
class Bird extends Animal
class Chicken extends Bird
type SubType = t forSome { type t <: Bird }
type SuperType = t forSome { type t >: Bird }
如我所料,SubType
是符合 Bird
的类型.自 Animal
是 Bird
的父类(super class), SubType
类型的变量不能保存 Animal
类型的值:
scala> val foo: SubType = new Animal
<console>:10: error: type mismatch;
found : Animal
required: SubType
val foo: SubType = new Animal
然而这个推论并不如我所料:
scala> val foo: SuperType = new Chicken
foo: SuperType = Chicken@1fea8dbd
赋值成功,下面这些也是:
scala> val foo: SuperType = 2
foo: SuperType = 2
scala> val foo: SuperType = "wtf?"
foo: SuperType = wtf?
scala>
同样,这里是 SuperType
:
type SuperType = t forSome { type t >: Bird }
根据 SLS 4.3 ,
A type declaration type t [tps ] >: L <: U declares t to be an abstract type with lower bound type L and upper bound type U.
所以我声明 t
成为具有下界的抽象类型 Bird
. Chicken
不是 Bird
的父类(super class), 也不是 String
也不Int
.
我认为可能是因为 Chicken
是一个 Any
和一个 SuperType
可以存储 Any
.但是,如果我更改 SuperType
的声明对此:
type SuperType = t forSome { type t >: Bird <: Animal}
设置Animal
的上限似乎什么都没有改变。
我如何分配类型的值 Chicken
Int
和 String
到 SuperType
存在子句允许的变量 { type t >: Bird }
和 { type t >: Bird <: Animal}
?
“A 类型声明 类型 t [tps ] >: L <: U 将 t 声明为抽象类型...”如果没有“抽象”一词,含义会有什么不同?
最佳答案
我认为混淆是在术语“绑定(bind)”和“约束”之间的使用。 “<:”和“>:”语法结构用于指定类型约束,而不是边界。当你说
{ type t >: Bird }
您只是限制了类型“t”,使得该类型的居民必须与 Bird 共享一个父类(super class)。由于 Chicken 和 Bird 都扩展了 Animal,所以约束得到满足,Scala 允许赋值。这也是为什么您的“伪造”分配起作用的原因(String 和 Int 都与 Bird 共享父类(super class) Any。您后来提出的约束
{ type t >: Bird <: Animal }
适当限制您的 String 和 Int 示例,因为在 String 或 Int 的类型层次结构中不存在满足既是 Bird 的父类(super class)型又是 Animal 的子类型的约束的类型。但是,这仍然允许您进行初始分配。
编辑:关于 SO 的其他答案说两者都称为边界。显示我知道多少。 :)
关于Scala:为什么不强制执行存在类型声明的下限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15819313/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我想编写一个 sql 查询,返回所有大于或等于 x 的值以及不大于 x 的第一个值。 例如,如果我们有一个包含值 1、2、3、4、5 且 x 为 3 的表,我需要返回 2、3、4、5。 我的示例包含均
假设一个斐波那契算法: 我们被要求证明这个算法的上限/下限。 我该如何继续? 更新 因此,我将解释我自己所做的事情并展示我遇到的问题。 我不知道为什么,但我决定在这里使用递推关系,看看在哪里可以得到我
我需要知道是否有东西在两个限制之间,但我在 Playground 上不断遇到相同的 2 个错误,而且我似乎无法在网上找到解决方案。知道如何在 Swift 中做到这一点吗? var upperLimit
给定一个值列表: >>> from scipy import stats >>> import numpy as np >>> x = list(range(100)) 使用学生 t 检验,我可以找到
lower_bound 是什么意思。如果我不得不猜测,我会回答这个函数在小于请求值的最后一个元素处返回迭代器。但我看到lower_bound 几乎和upper_bound 一样。唯一的区别是在 upp
所以 Pyqtgraph 会自动计算轴并在缩放时重新缩放,这很好。但是我有两个轴,频率和小时。频率可以采用 0-100 之间的任何值,小时可以采用 0-39 之间的任何值。如何将轴限制在这些上限/下限
如果用户输入的值超出范围,我需要显示错误消息并且不更改微调器的值。 如果使用微调按钮,则没有问题。但是,如果用户键入低于下界的数字,微调器会自动将其设置为下界值。这可能很好,但我需要确保用户知道。 S
我有以下谓词条件 predicate = cb.like(root.get(Product_.prodName),prod.getProductName()); 如何在上面的starement
任何人都可以建议一种使用 SSE4.1 之前的 SIMD 计算 float 下限/上限的快速方法吗?我需要正确处理所有极端情况,例如当我有一个 float 值时,它不能用 32 位 int 表示。 目
这个问题在这里已经有了答案: What is PECS (Producer Extends Consumer Super)? (16 个答案) 关闭 5 年前。 我正在尝试了解下限和上限通配符的行为
我想用误差线绘制一些数据点。其中一些数据点只有上限或下限,没有误差线。 所以我尝试使用索引来区分带有误差线的点和带有上限/下限的点。但是,当我尝试这样的事情时: errorbar(x[i], y[i]
在 Ruby 或 Rails 中,是否有一种内置方式或更优雅的方式将数字 num 限制为上限/下限? 例如像这样的东西: def number_bounded (num, lower_bound, u
我必须检查一个包含平方根的不等式。为了避免由于 float 不准确和舍入导致的不正确结果,我使用 std::nextafter() 来获取上限/下限: #include // DBL_MAX #in
我正在尝试根据可以是任意长度的数字数组来计算四分位数范围,例如 1, 1, 5, 6, 7, 8, 2, 4, 7, 9, 9, 9, 9 我需要从这个四分位数范围中计算出的值
我想使用 quantreg 从分位数回归中提取系数和上下限包裹。这是帮助文件中的示例。 data(engel) attach(engel) taus <- c(.05,.1,.25,.75,.9,.9
我有一个非常大的产品表。我需要选择几个偏移量非常高的产品(下面的示例)。 Postgresql 索引和性能手册建议在 ORDER BY + 最终条件使用的列上创建索引。一切都是桃色的,没有使用任何种类
我有一个产品表和两个 DATETIME 列,一个用于开始日期,一个用于结束日期。 如何检查特定产品 ID 是否在开始日期和结束日期之间?但是,如果其中一个或两个为 NULL(默认值),则接受此下限/上
我看到 Why is -1/2 evaluated to 0 in C++, but -1 in Python?表示在 Python 中整数除法向无穷大舍入,即 floor 应用于结果。 我认为 in
我正在使用 lower_bound() 在 weak_ptr 的排序 vector 中搜索 vector >::iterator findA( const string & id ) const {
我是一名优秀的程序员,十分优秀!