我只是在 Scala
中经历抽象类型我有一个错误
我正在尝试的示例:
scala> class Food
abstract class Animal {
type SuitableFood <: Food
def eat(food: SuitableFood)
}
defined class Food
defined class Animal
scala> class Grass extends Food
class Cow extends Animal {
type SuitableFood = Grass
override def eat(food: Grass) {}
}
defined class Grass
defined class Cow
scala> class Fish extends Food
defined class Fish
scala> val bessy: Animal = new Cow
bessy: Animal = Cow@5c404da8
scala> bessy.eat(new bessy.SuitableFood)
<console>:13: error: class type required but bessy.SuitableFood found
bessy.eat(new bessy.SuitableFood)
^
scala> bessy.eat(bessy.SuitableFood)
<console>:13: error: value SuitableFood is not a member of Animal
bessy.eat(bessy.SuitableFood)
scala> bessy.eat(new Grass)
<console>:13: error: type mismatch;
found : Grass
required: bessy.SuitableFood
bessy.eat(new Grass)
这些错误是什么?
为什么我不能通过
new Grass
到 eat
方法作为参数,当我创建一个对象时scala> val c=new Cow
c: Cow = Cow@645dd660
scala> c.eat(new Grass)
你能给我一些关于这个的想法吗?
最佳答案
当您分配 bessy
,你顶了Cow
实例到 Anmial
:
val bessy: Animal = new Cow
所以从静态的角度来看,
bessy
是 Animal
因此 bessy.SuitableFood
抽象的。现在到错误:new
创建抽象类型的对象。 . bessy.SuitableFood
尝试访问值成员 SuitableFood
(即 def/val)bessy
是“仅”一个 Animal
,你不知道(静态)它是否可以吃Grass
. 你能做的就是在
Animal
中添加一个方法允许你创造食物:abstract class Animal {
type SuitableFood <: Food
def eat(food: SuitableFood)
def makeFood(): SuitableFood
}
并实现:
class Cow extends Animal {
type SuitableFood = Grass
override def eat(food: Grass) {}
override def makeFood() = new Grass()
}
现在你可以打电话(在任何
Animal
上):bessy.eat(bessy.makeFood())
关于scala - scala 中的抽象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20070998/