gpt4 book ai didi

scala - Scala中涉及抽象类型时没有动态绑定(bind)?

转载 作者:行者123 更新时间:2023-12-05 01:21:13 29 4
gpt4 key购买 nike

当我在 Martin Odersky 的 Programming in Scala 中尝试抽象类型的 Animal/Food 示例时,

class Food
abstract class Animal {
type SuitableFood <: Food
def eat(food:SuitableFood)
}
class Grass extends Food
class Cow extends Animal {
type SuitableFood=Grass
override def eat(food:SuitableFood) {}
}
val bessy:Animal = new Cow
bessy.eat(new Grass)

我收到以下错误:

scala> <console>:13: error: type mismatch;
found : Grass
required: bessy.SuitableFood
bessy.eat(new Grass)
^

Martin最初的例子是bessy.eat(new Fish),肯定会失败,没想到Grass也会失败.可以通过让 bessyCow 而不是 Animal 来避免上述错误: val bessy:Cow = new Cow .

这是否意味着动态绑定(bind)在这里不起作用?

已编辑:Scala 中常规继承的简单动态绑定(bind):

abstract class Parent {
def sig:String = "Parent"
}
class Child extends Parent {
override def sig:String = "Child"
}

我有这个,其中 x:Parent 也给了 Child:

scala> new Child().sig
res1: String = Child

val x:Parent = new Child()
x: Parent = Child@3a460b07

x.sig
res2: String = Child

最佳答案

Scala 是静态类型的。任意动物不能吃草,而您刚刚尝试用草喂任意动物。它恰好是一头牛,但您已经声明(使用 : Animal)编译器可能只假定它是动物。

如果让编译器知道 bessy 是一头 Cow (val bessy = new Cow),那么她会吃草就好了。

关于scala - Scala中涉及抽象类型时没有动态绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20754143/

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