是的,您是對的。 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
字段值。
那麼這就是斯卡拉在特性實現字段的方式。