给定以下定义:
class R[T]
class A
class B
class C
这有效:
val s1 = new R[A] :: new R[B] :: HNil
val r1 = s1.toList
// r1 of type: List[R[_ >: A with B]]
虽然这不会:
val s2 = new R[A] :: new R[B] :: new R[C] :: HNil
val r2 = s2.toList
// could not find implicit value for parameter toList:
// shapeless.ToList[shapeless.::[R[A],
// shapeless.::[R[B],shapeless.::[R[C],shapeless.HNil]]],Lub]
我期望的地方:
// r2 of type: List[R[_ >: A with B with C]]
伪解决方案:
提供隐含的自己:
val r3 = s2.toList(ToList.hlistToList[R[A], R[B], ::[R[C], HNil],
R[_ >: A with B with C]])
这当然不是一个解决方案,因为它消除了HLists
(HList
由调用者提供以及所有必要的隐含)的全部好处。
澄清
List[R[_]]
如果最后得到没有类型限制的a,我会很高兴。