1
當我試圖在斯卡拉在馬丁·奧德斯基的編程抽象類型的動物/食品例,抽象類型涉及Scala時沒有動態綁定?
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)
^
原例如通過馬丁bessy.eat(new Fish)
,這肯定會失敗,但我沒想到它也會因爲Grass
而失敗。通過讓bessy
爲Cow
而不是Animal
:val bessy:Cow = new Cow
可以避免上述錯誤。
這是否意味着動態綁定在這裏不起作用?
編輯: 簡單的動態進行定期繼承Scala中綁定:
abstract class Parent {
def sig:String = "Parent"
}
class Child extends Parent {
override def sig:String = "Child"
}
而且我有這個,在x:Parent
給兒童還有:
scala> new Child().sig
res1: String = Child
val x:Parent = new Child()
x: Parent = [email protected]
x.sig
res2: String = Child
那麼,我採取的動態綁定概念是錯誤的? Java中的'List'具有'LinkedList'和'ArrayList',所以當你在一個'List'上調用一個'xs.get(idx)'時,當它是'ArrayList'的實現時就會得到'ArrayList'版本。我沒有想到Scala會偏離這一點。 – lcn
@lcn - 類型必須匹配。您的「簡單」示例對「Parent.sig」和「Child.sig」具有相同的類型簽名。繼承(C++中的「動態綁定」類型)工作得很好,但你必須服從你給出的類型。 –
所以你的意思是當涉及抽象類型時,'eat'方法會有*不同的簽名,因此是不同的方法?我明白這適合於抽象類型的目的,但應該記錄下這裏有* NO *動態綁定。 – lcn