Lui*_*hys 9 scala implicit-conversion
有人可以快速解释为什么隐式转换在这些情况下不起作用?谢谢.
scala> implicit def strTwoInt (s: String):Int = s.toCharArray.map{_.asDigit}.sum
strTwoInt: (s: String)Int
scala> List[Int]("1","2","3") sum
res3: Int = 6
scala> List("1","2","3") sum
<console>:9: error: could not find implicit value for parameter num: Numeric[java.lang.String]
List("1","2","3") sum
scala> val a = List("1","2","3")
scala> a.foldLeft(0)((i:Int, j:Int) => i+j)
<console>:10: error: type mismatch;
found : (Int, Int) => Int
required: (Int, java.lang.String) => Int
Run Code Online (Sandbox Code Playgroud)
隐式转换会转换Int中的String.在您的第一个示例中,它是由您尝试将字符串放入Int列表的事实触发的.
在第二个示例中,您有一个String of List,并且您调用方法sum,它采用隐式方法Numeric[String].您的转换不适用,因为您既没有尝试在编译器期望Int的地方传递String,也没有尝试调用Int中定义的方法而不是String中定义的方法.在这种情况下,您可以定义明确Numeric[String]使用转换的方法,也可以使用带有as参数的方法(给编译器提示):List[Int]
scala> def sumIt( xs: List[Int] ) = xs sum
sumIt: (xs: List[Int])Int
scala> sumIt( List("1","2","3") )
res5: Int = 6
Run Code Online (Sandbox Code Playgroud)
在第三个示例中,foldLeft第二个参数必须是以下类型:
(Int,String) => Int
Run Code Online (Sandbox Code Playgroud)
你实际传递的是类型:
(Int,Int) => Int
Run Code Online (Sandbox Code Playgroud)
但是,您没有在这两种类型之间定义任何隐式转换.但:
a.foldLeft(0)((i:Int, j:String) => i+j)
Run Code Online (Sandbox Code Playgroud)
触发你的转换和工作.
编辑:以下是如何实现Numeric[String]:
implicit object StringNumeric extends math.Numeric[String] {
val num = math.Numeric.IntIsIntegral
def plus(x: String, y: String) = num.plus(x,y).toString
def minus(x: String, y: String) = num.minus(x,y).toString
def times(x: String, y: String) = num.times(x,y).toString
def negate(x: String): String = num.negate(x).toString
def fromInt(x: Int) = x.toString
def toInt(x: String) = x
def toLong(x: String) = toInt(x)
def toFloat(x: String) = toInt(x)
def toDouble(x: String) = toInt(x)
def compare(x:String,y:String) = num.compare(x,y)
}
scala> List("1","2","3") sum
res1: java.lang.String = 6
Run Code Online (Sandbox Code Playgroud)
它工作,但结果是一个字符串.
| 归档时间: |
|
| 查看次数: |
5734 次 |
| 最近记录: |