很长一段时间我都试图避免隐式课程,但最近我陷入了困境。目前我无法弄清楚为什么函数aFunc2
的返回类型不能像aFunc1
中的参数那样转换为隐式形式。
object SO extends App {
implicit class Experiment[K, V](tpl: (K, V))(implicit o: Ordering[K], f: Fractional[V]) {
def foo(): String = "Bar"
}
// Works
println((12, 23.1).foo())
// Works
def aFunc1[K, V](e: Experiment[K, V]): String = e.toString
println(aFunc1((12, 23.1)))
// does not - why ?
def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = (12, 23.1)
}
编辑1:事实上这与类型有关,所以让我稍微扩展一下这个例子:
object SO extends App {
implicit class Experiment[K, V](tpl: (K, V))(implicit o: Ordering[K], f: Fractional[V]) {
def foo(): (K, V) = (tpl._1, tpl._2)
}
// Works
println((12, 23.1).foo())
// Works
def aFunc1[K, V](e: Experiment[K, V]): String = e.toString
println(aFunc1((12, 23.1)))
// still does not but K and V should actually match - i guess
def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = e.foo()
}
错误:
Error:(19, 66) type mismatch;
found : (K, V)
required: scratch.SO.Experiment[K,V]
def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = e.foo()
答案 0 :(得分:1)
如果没有您遇到的实际错误,有点难以猜测问题。您应该使用错误消息更新问题。
查看代码,我猜这个问题不是“隐式类”,而是你的类型不匹配的事实。
该行:
def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = (12, 23.1)
期望Experiment[K,V]
类型的返回值同时由您的方法的调用方指定K
和V
。
你要返回的是(Int, Double)
类型的元组,所以编译器会抱怨。
如果要返回Experiment[Int, Double]
,则应将函数定义修改为:
def aFunc2[K, V](e: Experiment[K, V]): Experiment[Int, Double] = (12, 23.1)
<强>更新强>
您是否可以尝试将K
和V
的隐式约束添加到aFunc2
的定义中?
它看起来应该类似于:
def aFunc2[K: Ordering, V: Fractional](e: Experiment[K, V]): Experiment[K, V] = e.foo()
你必须记住,为了将元组(K,V)
转换为Experiment[K, V]
,你需要在范围内有两个隐含值(K的排序和V的小数)。