<:<, <%<, =:= 的 Scala 实现在编译器中究竟是如何工作的?



我现在看到有一个相关的问题,询问这些运算符(<:<,<%<,=:=(在这里做什么:

<:><、><%<和 =:= 在 Scala 2.8 中是什么意思,它们记录在哪里?</p> <p>但我仍然对它们的实现感到困惑。 特别是,我假设一旦你放置了一个断言特定关系的隐式参数,那么你就可以使用变量,就好像它们已经自动正确转换一样,例如这将编译:</p>

class Foo[T](a: T) {
  def splitit(implicit ev: T <:< String) = a split " "
}
<p>但是这在编译器中实际上是如何工作的呢? 是否有一些神奇的编译器支持这些运算符,如果没有,允许它从定义中推断出这种关系的底层机制是什么?(此机制是否专门添加以允许这些操作员工作,以及它对这些特定操作员的具体程度如何? 你可以放置一个额外的隐式参数,这似乎有点神奇,它以某种方式改变了编译器对类型的解释。</p> </div> <div class="one_answers"> <p>实现有点棘手,但没有什么神奇的。</p> <p>Predef中有一个隐式方法,可以为任何A提供类型为 A <:< A 的值 </p>
implicit def conforms[A]: A <:< A
<p>当您尝试调用方法时,它会查找类型为 T <:< String 的隐式值。编译器将检查conforms[T]是否为有效值。假设T Nothing,那么作用域中将Nothing <:< Nothing一个隐式值,这将允许你的方法调用进行编译。由于定义<:<的方式</p>
sealed abstract class <:<[-From, +To]
<p> From允许向上变化,To允许向下变化。因此,Nothing <:< Nothing仍然是有效的Nothing <:< String Nothing因为String的子类型。String <:< String也是一个有效的Nothing <:< String因为StringNothing的超类型(但编译器似乎总是只选择第一种类型(。</p> <p>你可以对它调用String的方法,<:<因为它也扩展=>又名Function1,并作为从TString的隐式转换,这基本上最终会进行安全转换。</p> <p> =:=是一回事,只是它的定义没有任何方差注释,因此类型必须完全匹配。</p> <p> <%<的定义与<:<类似,但隐式方法略有不同,它添加了另一个参数来指定视图边界</p>
implicit def conformsOrViewsAs[A <% B, B]: A <%< B
<p>它也已弃用。</p> </div> </html>%>

相关内容

最新更新