gpt4 book ai didi

Scala隐式方法参数消除歧义

转载 作者:行者123 更新时间:2023-12-02 04:38:30 25 4
gpt4 key购买 nike

我不太明白下面的代码:

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 链接到序列[字符串]

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

最佳答案

直接回答你的问题,不,类型删除还没有发生。隐式搜索必须在完全了解类型的情况下进行。要查看这些方法在运行时如何,您可以运行 javap 来查看已编译的类:

scala> :javap M -s
Compiled from "<console>"
public class M$ {
public static final M$ MODULE$;
Signature: LM$;
public static {};
Signature: ()V

public void m(scala.collection.Seq<java.lang.Object>, M$AMarker$);
Signature: (Lscala/collection/Seq;LM$AMarker$;)V

public void m(scala.collection.Seq<java.lang.String>, M$BMarker$);
Signature: (Lscala/collection/Seq;LM$BMarker$;)V

public M$();
Signature: ()V
}

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

很酷的技巧顺便说一句!我以前没有看到它直接以这种方式使用。

关于Scala隐式方法参数消除歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39671079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com