scala隐式方法论证消除歧义

时间:2016-09-23 23:52:17

标签: scala implicit

我不太明白以下代码:

object M {
   implicit object AMarker
   implicit object BMarker

   def m(ints: Seq[Int])(implicit i: AMarker.type ): Unit = {
     println(s"int seq $ints");
   }

   def m(strs: Seq[String])(implicit s: BMarker.type ): Unit = {
     println(s"string seq $strs")
   }
 }

 import M._

 m(Seq(1, 2, 3))
 m(Seq("a", "b", "c"))

如果不是两个标记,它将无法编译,因为两个m方法在类型擦除后具有相同的签名。

但是,我不明白将AMarkerSeq[Int]以及BMarkerSeq[String]相关联的“神奇”是什么。

更具体地说,当我调用m(Seq("a", "b"))时,编译器如何知道它应该使用隐式BMarker,并调用第二个m?是否已将Seq类型删除?

1 个答案:

答案 0 :(得分:0)

直接回答你的问题,不,类型擦除还没有发生。隐式搜索必须在完全了解类型的情况下进行。要查看这些方法如何查看运行时,可以运行protected void RedirectToLogin_Click(object sender, EventArgs e) { // gets a provider name from the data-provider string provider = ((LinkButton)sender).Attributes["data-provider"]; // build the return address string returnUrl = new Uri(Request.Url, "ExternalLoginResult.aspx").AbsoluteUri; // redirect user into external site for authorization OAuthWeb.RedirectToAuthorization(provider, returnUrl); } protected void Page_Load(object sender, EventArgs e) { var result = OAuthWeb.VerifyAuthorization(); Response.Write(String.Format("Provider: {0}<br />", result.ProviderName)); if (result.IsSuccessfully) { // successfully var user = result.UserInfo; Response.Write(String.Format("User ID: {0}<br />", user.UserId)); Response.Write(String.Format("Name: {0}<br />", user.DisplayName)); Response.Write(String.Format("Email: {0}", user.Email)); } else { // error Response.Write(result.ErrorInfo.Message); } } 来查看已编译的类:

javap

基本上编译器已经制定了明确的运行时方法。它在编译期间查找确切的方法,并且基本上使用隐式对象来消除歧义。

酷戏BTW!我之前没有看到它直接使用过这种方式。