我不太明白以下代码:
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
方法在类型擦除后具有相同的签名。
但是,我不明白将AMarker
与Seq[Int]
以及BMarker
与Seq[String]
相关联的“神奇”是什么。
更具体地说,当我调用m(Seq("a", "b"))
时,编译器如何知道它应该使用隐式BMarker
,并调用第二个m
?是否已将Seq
类型删除?
答案 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!我之前没有看到它直接使用过这种方式。