Я пытаюсь найти способ избежать потери информации о типе в возвращаемом значении для моего метода.Избегайте потери информации о типе в возвращаемом значении
У меня есть следующие:
val defs0 = Default.mkDefault[Person, Some[String] :: Some[Int] :: HNil](Some("odd") :: Some(42) :: HNil)
Использование IntelliJs «Добавить аннотацию типа» дает тип:
Default.Aux[Person, ::[Some[String], ::[Some[Int], HNil]]]
Это нормально, за исключением того, что я не хочу, чтобы указать поля Person, когда я вызовите mkDefault. Так что я создал это:
object MkDefault {
object toSome extends Poly1 {
implicit def default[P] = at[P](Some(_))
}
def apply[P, L <: HList, D <: HList]
(p: P)
(implicit
lg: LabelledGeneric.Aux[P, L],
mpr: Mapper.Aux[toSome.type, L, D]
): Default.Aux[P, D] =
Default.mkDefault[P, D](mpr(lg.to(p)))
}
Теперь я могу сделать:
val defs1 = MkDefault(Person("odd", 42))
это хорошо, за исключением предполагаемого типа из IntellJ выглядит следующим образом:
Default.Aux[Person, HNil]
Как я могу сделать выведенный тип defs1 равен выведенному типу defs0?
* без указания полей класса Person
Используйте 'mpr.Out' как тип вывода вместо' d' – dk14