Учитывая следующие определения:
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[_]]
в конце без границ типа.
R[_ >: A with B with C]
) особенно желателен. Не лучше ли иметь номинальный супертипA
,B
,C
и т. д. и сделатьR
ковариантным? - person Miles Sabin   schedule 23.05.2013R[_]
в результате. Я не контролирую параметры типа, которые используются для R. Создание ковариантаR
действительно решает проблему, но кажется неправильным для того, что представляетR
в моем случае. Кроме того, я не могу гарантировать, что в будущемT
не окажется в контравариантной позиции вR
. - person gzm0   schedule 23.05.2013