Scala 中意外的隐式解析

Unexpected implicit resolution in scala

我试图在 Scala 2.11 中编写一些简单的类型级编程示例。这是一个判断类型相等性的函数:

def type_==[A, B](implicit ev: A =:= B = null) = ev != null

这里=:=定义在前奏中,但为了我们的目的,即使是简单的定义如

class =:=[A, B]
implicit def equalTypeInstance[A] = new =:=[A, A]

可以。可以肯定的是,可以做到

type_==[Int, String] // false
type_==[Int, Int] // true

接下来,我将布尔值编码为类型——为简单起见,我避免定义任何操作

sealed trait Bool
trait True extends Bool
trait False extends Bool

我可以再次检查

type_==[True, True] // true

所以我想我可以通过

Bool 转换为 Boolean
def bool2boolean[A <: Bool] = type_==[A, True]

重点是:

bool2boolean[True] // false

谁能解释一下原因?

隐式不会神奇地通过函数传递 - 每个函数都会创建自己的作用域,并且隐式解析会在那里发生:

def bool2boolean[A <: Bool] = type_==[A, True]

在此范围内编译器尝试解析一个=:=[A, True],找不到,所以这个函数总是returnsFalse.

尝试通过此函数传递证据:

def bool2boolean[A <: Bool](implicit ev: A =:= True = null) =
  type_==[A, True]