2

我很难写出应该很直截了当的东西,但我似乎无法正确使用语法。

我有一个食品类层次结构:

Food :> Vegetable :> Bamboo

对于动物:

Animal :> Herbivore :> Panda

而且我正在尝试在 Animal 中定义一种吃方法,以便熊猫一般不能吃蔬菜,只能吃 Bamboo。目前,我的代码如下所示:

class Food(val name : String)
class Vegetable(name: String) extends Food(name)
class Bamboo extends Vegetable("bamboo")

class Animal[F <: Food](val name : String) {
    def eat[T <: F](f : T) = println(s"$name eats some yummy ${f.name}")
}
class Herbivore[F <: Vegetable](name :String) extends Animal[Vegetable](name)
class Panda extends Herbivore[Bamboo]("panda")

我的麻烦是,当我创建一个蔬菜时,熊猫可以吃它:

(new Panda) eat (new Vegetable("potato"))

所以出了点问题:(

非常欢迎任何帮助:)

4

1 回答 1

8

你需要改变:

class Herbivore[F <: Vegetable](name :String) extends Animal[Vegetable](name)

至:

class Herbivore[F <: Vegetable](name :String) extends Animal[F](name)

否则,您将通过不使用 F 来丢弃类型信息。

于 2017-03-21T16:14:28.720 回答