Я хочу написать экземпляр anorm.ToStatement для универсального enumeratum.values.ValueEnumEntry [ValueType]. Но похоже, что ValueType не выводится правильно.
Мой код:
import java.sql.PreparedStatement
import anorm._
import enumeratum.values._
sealed trait Test extends IntEnumEntry
object Test extends IntEnum[Test] {
case object One extends Test {val value = 1}
val values = findValues
}
implicit def valueEnumEntryToStatement[ValueType: ToStatement, A <: ValueEnumEntry[ValueType]]: ToStatement[A] =
(s: PreparedStatement, index: Int, v: A) => implicitly[ToStatement[ValueType]].set(s, index, v.value)
val toStatement: ToStatement[Test] = implicitly[ToStatement[Test]] //NOT OK: diverging implicit expansion for type anorm.ToStatement[ValueType]
Ошибка при неявном расширении для типа anorm.ToStatement [ValueType].
Но если я устанавливаю тип Int явно, он работает.
//either
implicit def valueEnumEntryToStatement[A <: ValueEnumEntry[Int]]: ToStatement[A] =
(s: PreparedStatement, index: Int, v: A) => implicitly[ToStatement[Int]].set(s, index, v.value)
val toStatement: ToStatement[Test] = implicitly[ToStatement[Test]] //OK
//or
def valueEnumEntryToStatement[ValueType: ToStatement, A <: ValueEnumEntry[ValueType]]: ToStatement[A] =
(s: PreparedStatement, index: Int, v: A) => implicitly[ToStatement[ValueType]].set(s, index, v.value)
implicit def intEnumEntryToStatement[A <: IntEnumEntry]: ToStatement[A] = valueEnumEntryToStatement[Int, A]
val toStatement: ToStatement[Test] = implicitly[ToStatement[Test]]
Есть ли способ сделать общее решение без явной установки типа?