sealed trait StringReader[T] {def fromString(input: String): T}object StringReader {def fromString[T](input: String)(implicit reader: StringReader[T]): T =reader.fromString(input)implicit object IntStringReader extends StringReader[Int] {def fromString(input: String): Int = input.toInt}implicit object DoubleStringReader extends StringReader[Double] {def fromString(input: String): Double = input.toDouble}}case class Token(intField: Int, doubleField: Double)import StringReader.fromStringval token = Token(intField = fromString("1"), doubleField = fromString("1.0"))//Error:(30, 46) ambiguous implicit values:// both object IntStringReader in object StringReader of type A$A42.this.StringReader.IntStringReader.type//and object DoubleStringReader in object StringReader of type A$A42.this.StringReader.DoubleStringReader.type//match expected type A$A42.this.StringReader[T]//lazy val token = Token(intField = fromString("1"), doubleField = fromString("1.0"))//^
val token = Token(intField = fromString[Int]("1"), doubleField = fromString[Double]("1.0"))
--
Bu iletiyi Google Grupları'ndaki "Scala Türkiye" grubuna abone olduğunuz için aldınız.
Bu grubun aboneliğinden çıkmak ve bu gruptan artık e-posta almamak için scala-turkiy...@googlegroups.com adresine e-posta gönderin.
Daha fazla seçenek için https://groups.google.com/d/optout adresini ziyaret edin.
Daha kolay bir yolu yok gibi gözüküyor zamanında bizde benzer bir problemle karşılaşmıştık ama biz reflection kullanarak çözmüştük.Sizin istediğiniz çözümün benzeri burada var tek tek her tip için cast yapmalısınız ve ayrıca beklenen type bildirmelisiniz.
http://stackoverflow.com/questions/14791861/casting-string-to-int-using-scala-extractors
sealed trait StringConverter[+T] {def fromString(input: String): Tdef toString(input: T): String}object StringConverter {def fromString[T](input: String)(implicit converter: StringConverter[T]): T = converter.fromString(input)def toString[T](input: T)(implicit converter: StringConverter[T]): String = converter.toString(input)implicit object IntStringConverter extends StringConverter[Int] {
def fromString(input: String): Int = input.toInt
def toString(input: Int): String = input.toString}implicit object DoubleStringConverter extends StringConverter[Double] {
def fromString(input: String): Double = input.toDouble
def toString(input: Double): String = input.toString
}}object ScalaJSExample extends js.JSApp {case class Token(intField: Int, doubleField: Double)def main(): Unit = {val token = Token(
intField = StringConverter.fromString("1"),doubleField = StringConverter.fromString("1.0"))println(s"token: $token")val string = StringConverter.toString(1)println(s"string: ${string}")}}//Main.scala:9: error: covariant type T occurs in contravariant position in type T of value input// def toString(input: T): String// ^
Fehmi, Emrehan, fakat bu sefer de Int'e (ya da Double'a) ulasamiyorum.Soyle ki: def toString[S >: Int](input: S): String = (input * 2).toString compile olmuyor.