Ich versuche, ein generisches Merkmal 'Repo' für einige Typen zu erstellen, die Subtypen eines Merkmals 'Identifizierbar' sind. Mein Plan ist es, Implementierer von "Repo" zu instanziieren, indem ich einen generischen TypTag [HList] übergebe, der die "identifizierbaren" Subtypen beschreibt.Obere Grenze für HList-Typen zum Kompilierungszeitpunkt erzwingen
Wie kann ich dem Compiler garantieren, dass die Typen, die im HList übergeben werden, Subtypen des Merkmals "Identifizierbar" sind?
Hier ist, was ich bisher habe:
//All types in HList must extend Identifiable, how to enforce that at compile time?
trait Repo {
implicit val ltag: TypeTag[L] forSome {type L <: HList}
..
}
trait Identifiable {
..
}
case class Person(..) extends Identifiable
case class Address(..)
//This should compile
class MyRepo
(implicit val ltag: TypeTag[Person :: HNil])
extends Repo {
..
}
//This should not
class MyRepo
(implicit val ltag: TypeTag[Address :: HNil])
extends Repo {
..
}
//HList can contain an unknown number of types
ich diese Frage gesehen habe, die verwandt zu sein scheint: Type inference on contents of shapeless HList Unterschied ist ich arbeite nicht eine Implementierung des hList muß mit so nicht sicher, wie ich die Obergrenze nur mit Typen berechnen kann.
Was wäre die Syntax, um diesen Beweis zu einem Merkmal von einem Implementierer zu übertragen? Ich kann keine Typparameter an das Merkmal übergeben, daher fällt es mir schwer, meinen Kopf darum zu wickeln. – eirirlar
@eirirlar Siehe das obige Beispiel –
Ehrfürchtig, vielen Dank – eirirlar