Ich versuche einen Weg zu finden, um zu vermeiden, dass Typinformationen im Rückgabewert für meine Methode verloren gehen.Vermeiden Sie den Verlust von Typinformationen im Rückgabewert
Ich habe folgendes:
val defs0 = Default.mkDefault[Person, Some[String] :: Some[Int] :: HNil](Some("odd") :: Some(42) :: HNil)
Mit IntelliJs „Typanmerkung hinzufügen“ gibt den Typ:
Default.Aux[Person, ::[Some[String], ::[Some[Int], HNil]]]
Das ist in Ordnung, es sei denn ich möchte nicht die Felder der Person angeben, wenn ich Rufen Sie mkDefault auf. Also habe ich dies:
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)))
}
Jetzt kann ich tun:
val defs1 = MkDefault(Person("odd", 42))
was gut ist, mit Ausnahme der abgeleiteten Typ von IntellJ wie folgt aussieht:
Default.Aux[Person, HNil]
Wie kann ich der abgeleitete Typ von defs1 gleich dem abgeleiteten Typ von defs0?
* ohne die Felder der Klasse Person
Verwenden 'mpr.Out' als Ausgangstyp anstelle von 'D' – dk14