我无法理解如何创建以下代码的实现:
Ad-hoc polymorphism
The third approach in Scala is to provide an implicit conversion or implicit
parameters for the trait.
scala> trait Plus[A] {
def plus(a1: A, a2: A): A
}
defined trait Plus
scala> def plus[A: Plus](a1: A, a2: A): A = implicitly[Plus[A]].plus(a1, a2)
plus: [A](a1: A, a2: A)(implicit evidence$1: Plus[A])A
如何创建具体的实现,例如添加字符串或整数?
答案 0 :(得分:1)
喜欢这个吗?
scala> implicit object StringPlus extends Plus[String] {
| def plus(a1: String, a2: String) = a1+a2
| }
defined module StringPlus
scala> plus("asd", "zxc")
res1: String = asdzxc
答案 1 :(得分:1)
对于Plus[Int]
的示例实现,类似于:
scala> implicit val intPlus = new Plus[Int] { def plus(a1: Int, a2: Int):Int = a1 + a2 }
intPlus: Plus[Int] = $anon$1@42674853
...然后你使用它:
scala> plus(1, 2)
res1: Int = 3
答案 2 :(得分:0)
如果您允许我稍微更改语法,并更改您的运算符(因为+
已定义,例如String
):
trait Default[A] {
def default(a: A): A
}
implicit def stringToDefault(s: String) = new Default[String] {
def default(other: String) = ""
}
val s = "Hello"
val other = "Goodbye"
val res = s.default(other) // res = ""
这是你在找什么?现在我们已经成功地向类String
添加了一个新方法而没有对其进行修改,如果您将类型更改为复杂数字的自定义实现,则可以使用Plus
特征。