如何使用隐式 class 作为函数结果类型
How to use an implicit class as a function result type
很长一段时间以来,我都试图避免隐式 类 但最近我陷入了其中。目前我不明白为什么我的函数 aFunc2
的 return 类型不能像 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()
如果没有您遇到的实际错误,很难猜测问题所在。您应该使用错误消息更新问题。
查看代码,我猜问题不在于 "implicit class",而是您的类型不匹配。
行:
def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = (12, 23.1)
期望类型 Experiment[K,V]
的 return 值是 K
和 V
均由您的方法的调用者指定。
你 returning 是一个 (Int, Double)
类型的元组,所以编译器会报错。
如果你想 return 一个 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 的小数)。
很长一段时间以来,我都试图避免隐式 类 但最近我陷入了其中。目前我不明白为什么我的函数 aFunc2
的 return 类型不能像 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()
如果没有您遇到的实际错误,很难猜测问题所在。您应该使用错误消息更新问题。
查看代码,我猜问题不在于 "implicit class",而是您的类型不匹配。
行:
def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = (12, 23.1)
期望类型 Experiment[K,V]
的 return 值是 K
和 V
均由您的方法的调用者指定。
你 returning 是一个 (Int, Double)
类型的元组,所以编译器会报错。
如果你想 return 一个 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 的小数)。