2016-09-29 61 views
1

下面的代码将不能编译,为什么不斯卡拉与泛型类的情况下密封延伸特质

class FruitProcessor[T <: Fruit] { 
    def process(fruit: T) = { 
    // Do something with fruit 
    } 
} 

class FruitBlender[T <: Fruit] { 
    val fruitProcessor = new FruitProcessor[T] 

    def blend(fruit: T) = { 
    fruit match { 
     case b: Banana => fruitProcessor.process(b) 
     case a: Apple => fruitProcessor.process(a) 
    } 
    } 
} 


sealed trait Fruit 
case class Banana(id: String) extends Fruit 
case class Apple(id: String) extends Fruit 

的编译错误是沿着线的我不明白原因“发现香蕉,需要T”

我在这里做错了什么?

+0

放下'T',并将其替换为'Fruit'。 – Reactormonk

回答

3

process方法需要T类型的参数,但是您将其传递给类型为Banana的值。编译器不够聪明,因为在调用fruitProcessor.process(b)的代码路径中,T始终是Banana。其实你根本不需要那个匹配表达。在这种情况下,方法blend中的Tprocess想要的T相同。所以你可以拨打fruitProcessor.process(fruit)

1

拼出你做什么: 你有一个FruitProcessor参数与子类的FruitT,它可以processT秒。 然后,您制作FoodBlender也参数化了的子类T,它具有FoodProcessor[T],即它可以process各种T

既然你只能processT而不是[S <: Fruit],即只有你的FruitT亚型,其中搅拌器是参数化,而不是所有Fruit S的特定情况下,这不能与特定类型BananaApples工作。 FruitBlender上的T例如可以是class Pear extends Fruit,并且在那种情况下,blend的签名将是def blend(fruit: Pear),当然这与Apples或Bananas不兼容。