这是一个提示:
scala> implicit class X private (val i: Int) extends AnyVal { def doubled = 2 * i }
<console>:7: error: constructor X in class X cannot be accessed in object $iw
implicit class X private (val i: Int) extends AnyVal { def doubled = 2 * i }
^
这是确定的:
$ scala -optimise
Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_11).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :pa
// Entering paste mode (ctrl-D to finish)
class X private (val i: Int) extends AnyVal { def doubled = 2 * i }
object X { @inline def apply(i: Int) = new X(i) }
// Exiting paste mode, now interpreting.
defined class X
defined object X
scala> X(42).doubled
warning: there was one inliner warning; re-run with -Yinline-warnings for details
res0: Int = 84
您可以使用:javap -prv -
来验证是否有分配。
但这是一个更好的技巧:
scala> case class X private (val i: Int) extends AnyVal { def doubled = 2 * i }
defined class X
scala> X(42).doubled
res1: Int = 84
scala> :javap -prv -
[snip]
public $line7.$read$$iw$$iw$();
flags: ACC_PUBLIC
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: invokespecial #19 // Method java/lang/Object."<init>":()V
4: aload_0
5: putstatic #21 // Field MODULE$:L$line7/$read$$iw$$iw$;
8: aload_0
9: getstatic #26 // Field $line6/$read$$iw$$iw$X$.MODULE$:L$line6/$read$$iw$$iw$X$;
12: bipush 42
14: invokevirtual #30 // Method $line6/$read$$iw$$iw$X$.doubled$extension:(I)I
17: putfield #17 // Field res1:I
20: return
脚注:
scala> case class X[A <: X[A]] private (val i: Int) extends AnyVal { def doubled = 2 * i }
defined class X
scala> X(42).doubled
res2: Int = 84