在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}}
只有静态类型与包含它的类匹配时才能使用类型字段吗?如果是这样,书中的例子会误导吗?
答案 0 :(得分:1)
给定的示例没有错误,但这是误导性的,因为没有Animal
以这种方式实例化val name: Animal = new Animal-subtype
)eat
任何类型的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