![](/img/trans.png)
[英]Why is no implicit view found, when eta conversion and specifying type parameters does allow an implicit view to be found?
[英]Why implicit parameters cannot be passed explicitly when they undergo an implicit conversion?
为什么iWantInt(a)
不能在iWantInt(b)
编译而且 - 更令人惊讶的是 - iWantInt
呢?
我怎么能理解这种行为?
为什么我不能明确地传递a
以iWantInt
时,我可以隐传呢?
如何iWantA
从不同iWantInt
? 为什么它的工作方式不一样?
这种行为是在某处记录/解释的吗?
如果Scala接受iWantInt(a)
会导致什么样的问题? 为什么禁止它?
class A
class B
object Run extends App {
implicit val a = new A
implicit val b = new B
implicit def A2Int(implicit a:A)=1
implicit def B2Int(b:B)=2
def iWantA(implicit a:A)=println("A")
def iWantInt(implicit i: Int) = println(i)
iWantInt(b) // prints 2
iWantInt // prints 1
// iWantInt(a) // when uncommented this line does not compile, why ?
iWantA // prints A
iWantA(a) // prints A
}
而不是定义隐式转换, A2Int
就像一个已声明为隐式的值,如示例中的implicit val a
,唯一的区别是必须在范围内发现隐式A
才能使其工作。 这是允许iWantInt
没有显式参数进行编译的原因 - 编译器将A2Int
作为隐式Int
发现,然后找到a
作为A2Int
的隐式A
对于有资格作为隐式转换的函数,它必须采用单个非隐式参数。 B2Int
采用单个参数(b: B)
,因此符合要求。 这允许iWantInt(b)
进行编译。 A2Int
具有(implicit a: A)
但因为该参数是隐含A2Int
不符合要求,所以iWantInt(a)
不编译,除非像线implicit def A2Int2(a:A) = 1
被添加。 如果您使用-feature
标志运行scalac
(它至少建议使用2.11),它将显示B2Int
和A2Int2
警告,表示应通过显示scala.language.implicitConversions
显式启用隐式转换。 它没有显示A2Int
的警告,表明编译器不会将其视为隐式转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.