使用超类进行静态类型时,“在Scala中编程”中的类型字段示例不起作用

时间:2016-12-06 17:31:04

标签: scala

在Scala中编程,第一版,第20章,找到here,在清单20.9中包含此代码& 20.10(略有修改,因此奶牛有名字):

Cow

好的,目前已了解,因为只有// Also fails to compile! bessy eat (new Grass) 适合type mismatch; found : $file.memberType.Grass required: bessy.SuitableFood bessy eat (new Grass) 。但后来我尝试了这个:

Cow

编译错误是:

Grass

我真的很困惑为什么bessy无法吃Animal个实例。然后我注意到Cow的静态类型是// Works bessy.asInstanceOf[Cow] eat (new Grass) // Also works val cow_as_cow = new Cow("cow_as_cow") cow_as_cow eat (new Grass) ,并决定尝试制作静态类型{{1}}:

{{1}}

只有静态类型与包含它的类匹配时才能使用类型字段吗?如果是这样,书中的例子会误导吗?

1 个答案:

答案 0 :(得分:1)

给定的示例没有错误,但这是误导性的,因为没有Animal以这种方式实例化val name: Animal = new Animal-subtypeeat任何类型的Food

您会注意到下一个带有lassie的示例代码并不会重复该模式。我怀疑它在以后的版本中得到了纠正,但我没有一个人可以验证。

编译器遵循归属类型,如果这是你告诉它的。

abstract class A {val a = 1}
class B extends A {val b = 2}
val x: B = new B  // a complete B
x.a  // 1
x.b  // 2
val y: A = new B  // a restricted "view" of B (only the A parts)
y.a  // 1
y.b  // won't compile