2011-08-05 96 views
1

以下代碼錯誤與'類型不匹配'錯誤,說FooProcessor應該是Processor [M]。斯卡拉泛型和類型不匹配

sealed trait Model 
case class Foo extends Model 
trait Processor[M <: Model] 

class FooProcessor extends Processor[Foo] 

class DelegatingProcessor[M <: Model] extends Processor[M] { 
    val delegates = Map[String, Processor[M]]("foo" -> new FooProcessor()) 
} 

如何說服編譯器FooProcessor是Processor [Model]的擴展?

回答

3

簡短的回答是,您的FooProcessorProcessor[Foo]的擴展,並且特定於Foo。在DelegatingProcessor中,您需要一個Processor,它不僅能夠處理Foo,而且還能處理任何有效的ModelFooProcessor根本不符合這裏的法案。並且 - 不要試圖說服編譯器,否則,因爲編譯器在這裏完全是爲了防止這種錯誤:-)

+0

[斯卡拉新手在這裏]。雖然有多少有效的模型?不「密封」是指Foo是唯一的一個? – david

+0

是的,但編譯器不允許在這裏使用這些信息。如果你想強制'Foo'是唯一有效的模型,那麼寫'class DelegatingProcessor [M <:Foo]'。 –