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次.每个隐式类转换都有新的类实例化吗?如果是,为什么?如果不是,为什么"!!!" 打印三次?
您可以通过将扩展类设为值类来避免实例化它
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)),而不是对新实例化的对象的方法调用.
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |