Scala trait 未完待续

摘自《快学Scala》

14.trait的背后

Scala将trait翻译成JVM的类和接口。

只有抽象方法的trait

只有抽象方法的trait简单的变成一个Java接口。如:

trait Logger{
    def log(msg:String)
}
//被翻译成
public interface Logger{
    void log(String msg);
}

trait有具体的方法

有具体方法的trait,Scala会创建出一个伴生类,该伴生类用静态方法存放trait的方法。

trait ConsoleLogger extends Logger{
    def log(msg:String){
    println(msg)
    }
}
//翻译成
public interface ConsoleLogger extends Logger{
//生成的Java接口
    void log(String msg);
}
public class ConsoleLogger$class{
    //生成的Java伴生类
    public static void log(ConsoleLogger self, String msg){
        println(msg);
    }
    ...
}

这些伴生类不会有任何字段。trait中的字段对应到接口中的抽象的getter和setter。当某个类实现该trait时,字段被自动加入。
如:

trait ShortLogger extends Logger{
    val maxLength = 15 //具体的字段
    ...
}
//被翻译成
public interface ShortLogger extends Logger{
    public abstract int maxLength();
    public abstract void weird_prefix$maxLength_$eq(int);
    ...
}
//这里需要以weird开头的setter方法,用来初始化该字段。
//初始化发生在伴生类的一个初始化方法内:
public class ShortLogger$class{
    public void $init$(ShortLogger self){
        self.weird_prefix$maxLength_$seq(15)
    }
    ...
}

当trait被混入类的时候,类将会得到一个带有getter和setter的maxLength字段。那个类的构造器会调用初始化方法。
如果trait扩展自某个超类,则伴生类并不继承这个超类。该超类会被任何实现该trait的类继承。

15.课后习题

1.定义一个RectangleLike trait,加入具体的translate和grow方法。

java.awt.Rectangle

你可能感兴趣的:(scala)