2017-10-03 18 views
0

私は、HListのパラメータ(A)を受け取るメソッドを持つ抽象クラスを持っています。私はこのHListの正確な種類を制限したいサブクラス(B)におけるしかし シェイプレスHListパラメータのオーバーライド

次のコードは、(それがHListのサブクラスとして(Int :: String :: HNil)は表示されません。しかし、どのように達成することができます動作しません。同様の効果?HListsなくても

import shapeless.{::, HList, HNil} 
import shapeless.syntax.std.tuple._ 

abstract class A{ 
    def test[H <: HList](h: H): String 
} 


class B extends A { 
    override def test(h: (Int :: String :: HNil)): String = { 
    val a = h(0) 
    val b = h(1) 
    s"$a -- $b" 
    } 
} 


new B().test(25 :: "testje" :: HNil) 

答えて

3

が、これはそのままあなたがScalaで行うことができますものではありません。これは、woはない

trait Foo 
trait Bar extends Foo 

abstract class A { 
    def test[T <: Foo](t: T): String 
} 

class B extends A { 
    override def test(b: Bar): String = //... 
} 

シンプルな何かをしようとして想像してrkはB.testにはA.testと同じ署名がないためです。 1つは型パラメータを持ち、もう1つは型パラメータを持ちません。継承では、BAとして機能する必要がありますが、ここではそのことはできません。

代わりに、クラス自体への型パラメータを移動することができ:

abstract class A[T <: Foo] { 
    def test(t: T): String 
} 

class B extends A[Bar] { 
    override def test(b: Bar): String = //... 
} 

HListsを使用している場合これも正常に動作する必要があります。

関連する問題