sum[B >: (A, B)](implicit num: Numeric[B]): B
の場合は、表示されているとおり、implicit
パラメータが必要です。パラメータタイプはNumeric[B]
タイプです。
スカラNumeric
は、一連の数学演算を定義したtrait
です。あなたのケースのための http://www.scala-lang.org/api/current/scala/math/Numeric.html
は、タイプがMap[String, Int]
あるので、あなたは次のように、sum
方法のためNumeric[(String, Int)]
ためimplicit
を実装する必要があります。私たちは自分のNumeric
タイプを実装する必要があり、上記のコードのよう
trait MyTupleNumeric extends Numeric[(String, Int)] {
def plus(x: (String, Int), y: (String, Int)) = ("", x._2 + y._2)
override def minus(x: (String, Int), y: (String, Int)): (String, Int) = ("", x._2 - x._2)
override def times(x: (String, Int), y: (String, Int)): (String, Int) = ("", x._2 * y._2)
override def negate(x: (String, Int)): (String, Int) = ("", -x._2)
override def fromInt(x: Int): (String, Int) = ("", x)
override def toInt(x: (String, Int)): Int = x._2
override def toLong(x: (String, Int)): Long = x._2.toLong
override def toFloat(x: (String, Int)): Float = x._2.toFloat
override def toDouble(x: (String, Int)): Double = x._2.toDouble
override def compare(x: (String, Int), y: (String, Int)): Int = x._2 - y._2
}
implicit object MyTupleNumericImplicit extends MyTupleNumeric
val f = implicitly[Numeric[(String, Int)]] // implicitly is used find implicits base on the type
println(f.plus(("one", 2), ("two", 3)))
val r = Map("one" -> 2, "two" -> 3, "three" -> 4)
println(r.sum._2)
println(r.sum(MyTupleNumericImplicit))
(String, Int)
で処理し、メソッドを実装します。
そして私たちはimplicit
これを私たちのスコープに入れましたので、implicitly
を使ってfunction
と呼ぶことができます。
そしてsum
方法は、また、実際にsum` `の完全な型シグネチャではありませんNumeric[(String, Int)]
ため
implicit
パラメータを見つけることができます。 [*なぜscaladocメソッドのシグネチャが間違っていますか?*](https://stackoverflow.com/questions/26132459/why-are-scaladoc-method-signatures-wrong) –