在学习Shapeless时,我想知道为什么这段代码无法编译:
def someHList[H <: HList]: H = HNil
由于HNil对象扩展了HNil特征,而HNil特征扩展了HList,因此这是正确的。
在特征中定义一种方法的正确方式是仅由扩展类实现返回某些HList的方法。
我想做如下操作:
trait Parent {
def someHList[H <: HList]: H
}
object Child1 extends Parent {
def someHList[H <: HList] = HNil
}
object Child2 extends Parent {
def someHList[H <: HList] = 1 :: "two" :: HNil
}
任何建议都会受到赞赏。谢谢!
编辑
为了阐明我在原问题中未明确的问题:
1.) 最好不需要在每个实现类中显式指定H
,而是让它被推断出来(在调用站点?)。
2.) 我想在父特征中使用HNil作为默认实现,可以在子类中选择性地覆盖。我的例子可能应该是:
trait Parent {
def someHList[H <: HList]: H = HNil
}
object Child extends Parent {
override def someHList[H <: HList] = 1 :: "two" :: HNill
}