是的,您是对的。 checkTrait$setter$name_$eq(String s)
是一个Mutator方法用于初始化设置name
的值。
这斯卡拉性状造成将转变成Java接口,并且由于的Javainterface
领域是implicitly static and final
,但在Scala
trait
领域必须的class
或instance
的领域。因此Mutator方法用于初始化checkTrait
子类的字段。
Java 8 (pre-release) interface member variables
充分的解释:
当你的编译,Scala编译器转换trait
checkTrait
到的Java的interface
。并为此编译应该有另一个静态init
方法checkTrait
,如:
public interface checkTrait {
public abstract void checkTrait$_setter_$name_$eq(java.lang.String);
public abstract java.lang.String name();
public static void $init$(checkTrait);
Code:
1: ldc #18 // String male
3: invokeinterface #20, 2 // InterfaceMethod checkTrait$_setter_$name_$eq:(Ljava/lang/String;)V
8: return
}
正如你可以看到,这是一个静态初始化法接受checkTrait
实例参数。并且调用checkTrait$_setter_$name_$eq
这个增变器方法到最初的设定值其值为:男性。
让我们试着extend
checkTrait
:
class A extends checkTrait
和编译这A
类:
public class A implements checkTrait {
public java.lang.String name();
Code:
0: aload_0
1: getfield #15 // Field name:Ljava/lang/String;
4: areturn
public void checkTrait$_setter_$name_$eq(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #15 // Field name:Ljava/lang/String;
5: return
public A();
Code:
0: aload_0
1: invokespecial #24 // Method java/lang/Object."<init>":()V
4: aload_0
5: invokestatic #28 // InterfaceMethod checkTrait.$init$:(LcheckTrait;)V
8: return
}
而且我们可以发现,在A
的构造方法,它将调用checkTrait
static init
方法:
5: invokestatic #28 // InterfaceMethod checkTrait.$init$:(LcheckTrait;)V
带通电流实例至初始name
字段值。
那么这就是斯卡拉在特性实现字段的方式。