是否为每个隐式类转换创建了新的类实例?

dve*_*eim 2 scala implicit

object test extends App {
  implicit class f(i: Int) { println("!!!"); def f = 42 + i }
  1.f
  2.f
  3.f
}
Run Code Online (Sandbox Code Playgroud)

在.class文件中我们看到

public static test$f f(int);
  Code:
     0: getstatic     #16                 // Field test$.MODULE$:Ltest$;
     3: iload_0
     4: invokevirtual #42                 // Method test$.f:(I)Ltest$f;
     7: areturn
Run Code Online (Sandbox Code Playgroud)

所以,看起来有一个静态方法,但这段代码打印"!!!" 跑步时3次.每个隐式类转换都有新的类实例化吗?如果是,为什么?如果不是,为什么"!!!" 打印三次?

lau*_*lic 5

您可以通过将扩展类设为值类来避免实例化它

implicit class f(val i: Int) extends AnyVal { def f = 42 + i }
Run Code Online (Sandbox Code Playgroud)

请注意,那么你不能放入println内部,但这里是上面链接的文档的引用:

在运行时,此表达式3.toHexString被优化为等效于静态对象上的方法调用(RichInt $ .MODULE $ .extension $ toHexString(3)),而不是对新实例化的对象的方法调用.