【发布时间】:2019-06-06 15:31:53
【问题描述】:
下一个代码无法编译。为什么Santorin不能吃HorseFood? Tornado 被声明为新的Horse,而Horse 是Animal 的子类型,但它可以“吃掉”HorseFood。
import scala.io.StdIn._
import util._
class Food
abstract class Animal
{
type SuitableFood <: Food
def eat(food: SuitableFood)
}
class Grass extends Food /*extends meaning should be "more specific than*/
class Fish extends Food
class HorseFood extends Grass
class Cow extends Animal
{
type SuitableFood = Grass
override def eat(food: SuitableFood) = {}
}
class Horse extends Animal
{
type SuitableFood = Grass
override def eat(food: SuitableFood) = {}
}
class Whale extends Animal
{
type SuitableFood = Fish
override def eat(food: SuitableFood) = {}
}
object abstractExample1 {
def main(args: Array[String]) {
val bessy: Animal = new Cow
println("bessy = " + bessy)
bessy eat (new Grass).asInstanceOf[bessy.SuitableFood]
/*added this line because of a great answer someone posted for this questions but he deleted*/
val willie: Animal = new Whale
println("willie = " + willie)
val santorin: Animal = new Horse
println("santorin = " + santorin)
val tornado = new Horse
tornado eat new HorseFood
print("tornado = " + tornado)
santorin.eat(new HorseFood)
}
}
这不应该被自动允许吗(如Horse 扩展Animal)?为什么不呢?
注意Tornado,声明可以吃HorseFood,扩展Grass,并且Horse类的食物参数是Grass。
= 有问题吗?我的意思是,SuitableFood 正是 Grass 而不是 Grass 的类 C 扩展。
【问题讨论】:
-
为什么你没有声明这个? - val 龙卷风:动物 = 新马
-
我做到了,龙卷风不能再吃 HorseFood 了。
标签: scala abstract-type