假设在 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
,因此类型的变量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,
类型声明 type t [tps ] >: L <: U将t声明为具有下限类型L和上限类型U的抽象类型。
所以我声明t
是一个具有下界的抽象类型Bird
。 Chicken
不是 的超类Bird
,既不是String
也不是Int
。
我想这可能是因为 aChicken
是一个Any
并且 aSuperType
可以存储一个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是抽象类型......”如果没有“抽象”这个词吗?