2016-01-21 6 views
2

Я использую Generic в моем уровне БД для преобразования экземпляров классов case в List[Any] типов JDBC-жалоб. Таким образом, я следующий рисунок, повторяющий все времяНевозможно написать общую функцию для бесформенного Generic

val genSignal = LabelledGeneric[Signal] 
genSignal.to(item).values.map(toSqlTypedHlist).toList 

IntelliJ намекает, что values неизвестно поле, но он компилирует. Поэтому я решил написать следующий метод

private def getSqlValuesFromCaseClass[T <: AnyRef : Generic](item : T) : Seq[Any] = { 
    val generic: Generic[T] = implicitly[Generic[T]] 
    generic.to(item).values.map(toSqlTypedHlist).toList 
    } 

где toSqlTypedHlist является

private object toSqlTypedHlist extends Poly1 { 
    implicit def atAnything[T: SqlTyped] = at[T](_.toSqlType) 
} 

но он не компилировать говорить, что

Error:(730, 22) value values is not a member of generic.Repr 
    generic.to(item).values.map(toSqlTypedHlist).toList 
        ^

Что я здесь отсутствует?

UPD: Я обновил функцию следуя за советом Майлса, но это не помогло

private def getSqlValuesFromCaseClass[T <: AnyRef : Generic](item : T) : Seq[Any] = { 
    val generic: Generic[T] = implicitly[Generic[T]] 
    generic.to(item).map(toSqlTypedHlist).toList 
} 

Я получаю следующее сообщение об ошибке

Error:(73, 22) value map is not a member of generic.Repr 
    generic.to(item).map(toSqlTypedHlist).toList 
        ^
+0

Можете ли вы сказать, что такое 'toSqlTypedHlist'? Это бесформенный «Поли»? –

+0

@MilesSabin Удовольствие вас, Майк. 'toSqlType' является функцией неявного класса: https://github.com/cppexpert/article-reader/blob/master/src/main/scala/co/kernelnetworks/medstream/server/db/package.scala#L21-L24 – expert

+0

Вы указали мне на 'toSqlTyped', который является обычным методом Scala. Мне нужно увидеть определение 'toSqlTypedHList', которое, я думаю, должно быть бесформенным« Poly », если этот первый фрагмент компилируется. –

ответ

1

Попробуйте что-то вдоль линий,

import shapeless.ops.hlist.Mapper 

private def getSqlValuesFromCaseClass[T, R <: HList](item: T) 
    (implicit 
    gen: Generic.Aux[T, R], 
    mpr: Mapper[toSqlTypedHlist.type, R] 
): Seq[Any] = { 
    gen.to(item).map(toSqlTypedHlist).runtimeList 
} 

Что вам не хватило, был экземпляр Mapper (с индексом HList тип представления R и одноэлементный тип вашего Poly).

Обратите внимание, что использование runtimeList теряет точность, как того требует результирующего типа подпись Seq[Any], однако это не идиоматическое использование бесформенного ... обычно я бы ожидал увидеть именно набранное вычисление над отображенными элементами или какой-то складкой.

+0

Спасибо! Я получаю 'значение runtimeList не является членом mpr.Out' с этой версией функции. – expert

+0

Какую версию бесформенного вы используете? –

+0

2.2.5 (я не могу отправить ответ, потому что он слишком короткий, поэтому я написал это предложение) – expert

Смежные вопросы