gpt4 book ai didi

Scala:为什么不强制执行存在类型声明的下限?

转载 作者:行者123 更新时间:2023-12-04 18:10:12 25 4
gpt4 key购买 nike

假设在 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 的类型.自 AnimalBird 的父类(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 IntStringSuperType存在子句允许的变量 { 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com