2017-03-21 9 views
2

私は非常に単純明快なものを書くのが難しいですが、私は正しい構文を得ることができません。Scalaのクラス型パラメータ。

私は食品のクラス階層があります。

Food :> Vegetable :> Bamboo 

や動物用:

Animal :> Herbivore :> Panda 

そしてパンダが食べることができないように私は、動物で食べる方法を定義しようとしているが一般的な野菜、竹のみ。現時点では、私のコードは次のようになります。

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")) 

だから、何かが間違って起こっている:(

すべてのヘルプは、変更する必要が

答えて

8

:)非常に歓迎されるでしょう:

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

へ:

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

そうでなければあなたはF.

+0

にpanda.eatを修正する多くの感謝:)(ポテト)問題を使用しないことにより、型情報を投げています。今、私は問題を持っています(新しいHerbivore( "牛"))食べる(新しい竹)はコンパイルされません:(----申し訳ありません、私はそれを牛と呼ぶべきではない、新しいHerbivore私はまた、「Animal」と「Herbivore」が非抽象クラスであるとは考えていないと思います(「一般草食動物」) – ehrt1974

+1

@ ehrt1974 '新しいHerbivore [野菜]("ジェネリックherbivore ")eat(new Bamboo)' – nmat

+0

。 –

関連する問題