2017-02-26 9 views
0

型パラメータを含むクラスに対して継承を使用しようとしていますが、scalaコンパイラが型を正しく継承できませんでした。より上位の種類の継承を使用するにはどうすればよいですか?

trait Printer[X] { 
    def pretty(src : X) : String 
} 

final case class Higher[P[_] <: Printer[_], X](printer : P[X]) { 
    def pass(arg : X) : String = { 
    val pr : Printer[X] = printer 
    pr.pretty(arg) 
    } 
} 

コンパイラの出力:正常にコンパイル型パラメータなしのクラスへ

InheritanceFailed.scala:23: error: type mismatch; 
found : P[X] 
required: test.failedinheritance.Inner.Printer[X] 

     val pr : Printer[X] = printer 
          ^
one error found 

反し:

trait Printer { 
    def pretty(src : Int) : String 
} 

final case class Higher[P <: Printer](printer : P) { 
    def pass(arg : Int) : String = { 
    val pr : Printer = printer 
    pr.pretty(arg) 
    } 
} 

は、コンパイラのapprehensible方法で、より高kinded例を宣言することは可能ですか?

+0

なぜP [_]が必要ですか?あなたは必要なものに対して 'Printer [X]'で十分ではありませんか?意味: 'final case class Higher [X](プリンタ:Printer [X]) –

+0

私はもっと複雑なユースケースを持っています。私はここに最小再現可能な例 – ayvango

答えて

1

PPrinterの型パラメータが同じであることをコンパイラに伝えるには、ワイルドカードの代わりに名前を使用する必要があります。

trait Printer[X] { 
    def pretty(src : X) : String 
} 

final case class Higher[P[Y] <: Printer[Y], X](printer : P[X]) { 
    def pass(arg : X) : String = { 
    val pr : Printer[X] = printer 
    pr.pretty(arg) 
    } 
} 
+0

を投稿しました。ありがとう、それは正常に働いた。私はスカラーの中で 'Y'のような束縛されていない型のパラメータが許されるとは決して考えなかった – ayvango

関連する問題