nehme ich an einen Satz von Wandlern String haben, als Typklasse:Get Runtime Art von impliziten Beweis gepflückt
import scala.reflect.runtime.universe._
abstract class ToStringConverter[T] {
def convert(value: T): String
}
implicit object IntToStringConverter extends ToStringConverter[Int] {
def convert(value: Int) = value.toString
}
implicit object DoubleStringConverter extends ToStringConverter[Double] {
def convert(value: Double) = value.toString
}
und convert-Methode, die die Typinformationen verwendet rechten Konverter zur Auswahl:
def convert[T](v: T)(implicit ev: ToStringConverter[T]): String = ev.convert(v)
Dies funktioniert gut, wenn ich die konkrete Art im Voraus haben, zum Beispiel:
scala> convert[Double](12.2)
res0: String = 12.2
scala> convert[Int](12)
res1: String = 12
Ist es möglich, Verwenden Sie die obige Konvertierungsmethode mit einem Laufzeittyp, zum Beispiel mit einem Typ 't' unten?
scala> val t = typeOf[Double]
t: reflect.runtime.universe.Type = Double
Ihr 'convert' erwartet einen Wert als Parameter - was möchten Sie mit' t' machen? Wenn Sie 'convert (t)' aufrufen wollen, können Sie 'implizite Objekte bereitstellen. RTUStringConverter erweitert ToStringConverter [runtime.universe.Type]' leicht. – Suma
Die Konvertierungsmethode erwartet derzeit einen Typparameter, und dieser Typ wird verwendet, um den Bereich über den impliziten Mechanismus zum richtigen Konverter zu bringen. Manchmal kenne ich den Typ nicht im Voraus, ich habe nur einen Typ, der es darstellt, also sollte ich die Signatur ändern, um in der Type-Instanz zu übergeben, und manuell irgendwie den impliziten Konverter für diesen Typ erhalten? – gnf
Sie möchten es wie 'val a: Any; called [t] (a)'? – Suma