2017-04-17 45 views
2

我Scala中所定義的性狀如Scala中使用的Val性狀

trait checkTrait 
{ 
    val name:String = "male" 
} 

據我所知,當VAL Scala中類聲明僅生成訪問器,但是當我使用JAD反編譯反編譯上述代碼下列獲取生成

public interface checkTrait 
{ 

    public abstract void checkTrait$_setter_$name_$eq(String s); 
    public abstract String name(); 
} 

無法理解到底是什麼「checkTrait $ setter $ name_ $ eq(String s)」 是不是Mutator?如果是Mutator,那麼它們是如何生成的,因爲按照語言規範,Mutals不會生成爲Vals

回答

2

是的,您是對的。 checkTrait$setter$name_$eq(String s)是一個Mutator方法用於初始化設置name的值。

斯卡拉性狀造成將轉變成Java接口,並且由於的Javainterface領域是implicitly static and final,但在Scalatrait領域必須的classinstance的領域。因此Mutator方法用於初始化checkTrait子類的字段。

Java 8 (pre-release) interface member variables

充分的解釋:

當你的編譯Scala編譯器轉換traitcheckTrait的Javainterface。併爲此編譯應該有另一個靜態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這個增變器方法到最初的設定值其值爲:男性

讓我們試着extendcheckTrait

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的構造方法,它將調用checkTraitstatic init方法:

5: invokestatic #28     // InterfaceMethod checkTrait.$init$:(LcheckTrait;)V 

帶通電流實例至初始name字段值。

那麼這就是斯卡拉特性實現字段的方式。