【发布时间】:2015-08-09 15:32:40
【问题描述】:
在 scala 中,以下代码可以正确编译:
class a {}
class b {}
object Main {
implicit class Conv[f, t](val v: f ⇒ t) extends AnyVal {
def conv = v
}
def main(args: Array[String]) {
val m = (a: a) ⇒ new b
m.conv
}
}
但由于某种原因,以下编译失败:
class a {}
class b {}
object Main {
type V[f, t] = f ⇒ t
implicit class Conv[f, t](val v: V[f, t]) extends AnyVal {
def conv = v
}
def main(args: Array[String]) {
val m = (a: a) ⇒ new b
m.conv
}
}
带有以下信息:
value conv is not a member of a => b
m.conv
为什么会这样?
编辑:是的,即使使用
仍然有错误 val m: V[a,b] = new V[a,b] { def apply(a: a) = new b }
【问题讨论】:
-
嗯,你可以通过在类型别名中声明函数参数的方差来解决这个问题:
type V[-f, t] = f ⇒ t -
好吧,你没有从
(a => b)到Conv[a,b]的隐式转换,所以我首先认为注释类型应该有助于val m: V[a, b] = (a: a) ⇒ new b。但事实证明,将错误更改为value conv is not a member of V[a,b] | m.conv仍然无法编译(尽管 IntelliJ Idea 找到了隐式转换)。