2017-04-17 42 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字段值。

那么这就是斯卡拉特性实现字段的方式。