scala 與groovy 語法對比----長期更新
阿新 • • 發佈:2019-01-27
最近在學scala的同時也在接觸groovy,因為每個語言都有很多相同點和不同點,拿出來比較就不容易混亂了。太基本的語法這裡就不列出來對比了,只列出些遇到的比較重要的語法或者特性之間容易混淆的東西。
一、traits 特性
在scala中 traits的出現是為了代替java中的interface,與interface不同的是,interface只可以宣告抽象方法,而traits可以宣告抽象/具體屬性,抽象/具體方法。可以這麼說,trait內部的寫法可以與一個普通的類沒什麼區別。並且trait可以被多重繼承。
在groovy中也是如此。
那麼它們有什麼不同呢?普通的語法格式這裡就不指出來了,就說說多重繼承的區別。
1-1擺例子
scala程式碼
groovy程式碼:trait Logged { def log(msg: String) // This method is abstract } trait ShortLogger extends Logged { val maxLength = 15 // A concrete field override def log(msg: String){print("23")} def fun(){} } trait ShortLogger1 extends Logged { val maxLength = 16 // A concrete field override def log(msg: String){print("2sdf3")} def fun(){} } // 這裡會報錯,因為scala並不知道使用哪個maxLength屬性和fun()方法,解決辦法是 分別override覆蓋maxLength屬性和fun()方法 class SavingsAccount extends ShortLogger with ShortLogger1{ /* override val maxLength = 17*/ }
結果:trait Logged { void log(String msg){} } trait ShortLogger extends Logged { def maxLength = 15 // A concrete field void log(String msg){print("23")} } trait ShortLogger1 extends Logged { def maxLength = 16 // A concrete field void log(String msg){print("2sdf3")} } // 這裡實現的兩個traits中,後者會覆蓋前者 class SavingsAccount implements ShortLogger , ShortLogger1{ } def sa = new SavingsAccount(); println(sa.maxLength); sa.log("haha")
16
2sdf3
總結:groovy的語法看上去更智慧一點,但是它卻強硬地幫我們做出了選擇,後者一定會覆蓋前者。而sacla看上去比較死板,如果需要用到多個特性並保留每個屬性或方法,那麼各個trait的屬性名和方法名儘量不應該相同,可以加個字首。