2017-10-03 5 views
0

Ich habe eine abstrakte Klasse mit einer Methode, die einen HLists als Parameter erhält (A). jedoch in den Unterklassen würde Ich mag die genauen Typen dieser hList (B)Shapeless HList Parameterüberschreibung

Der folgende Code funktioniert nicht beschränken (es ist nicht (Int :: String :: HNil) als Unterklasse von HList sieht. Aber wie kann ein erreichen ähnliche Wirkung?

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) 

Antwort

3

Auch ohne HLists, das ist nicht etwas, das Sie in Scala tun können, wie sie ist. Stellen Sie sich vor, etwas zu tun einfache

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 = //... 
} 

Dies gilt nicht versuchen, wo rk, weil B.test nicht die gleiche Signatur wie A.test hat. Einer hat einen Typparameter, der andere nicht. Vererbung erfordert, dass ein B in der Lage sein sollte, als A zu fungieren, aber das kann hier eindeutig nicht passieren.

Stattdessen könnten Sie den Typ-Parameter auf die Klasse bewegen sich:

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

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

Dies sollte auch funktionieren, wenn HLists verwenden.

Verwandte Themen