2011-08-05 15 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では、Fooだけでなく、有効なModelも処理できるProcessorが必要です。 FooProcessorは単にここで請求書に適合しません。そして、コンパイラがこの種の間違いを防ぐためにここに来ているので、コンパイラを納得させようとしないでください.-

+0

[Scala newbie here]どれくらいの有効なモデルがそこにありますか? Fooが唯一のものであることを「封印」していないのですか? – david

+0

はい、コンパイラはここでその情報を使用することはできません。 'Foo'が有効な唯一のモデルであることを強制したい場合は' class DelegatingProcessor [M <:Foo] 'と書いてください。 –