scala 与groovy 语法对比----长期更新

来源:互联网 发布:淘宝如何上新 编辑:程序博客网 时间:2024/04/29 11:16

最近在学scala的同时也在接触groovy,因为每个语言都有很多相同点和不同点,拿出来比较就不容易混乱了。太基本的语法这里就不列出来对比了,只列出些遇到的比较重要的语法或者特性之间容易混淆的东西。

一、traits 特性

在scala中 traits的出现是为了代替java中的interface,与interface不同的是,interface只可以声明抽象方法,而traits可以声明抽象/具体属性,抽象/具体方法。可以这么说,trait内部的写法可以与一个普通的类没什么区别。并且trait可以被多重继承。

在groovy中也是如此。

那么它们有什么不同呢?普通的语法格式这里就不指出来了,就说说多重继承的区别。

1-1摆例子

scala代码

trait Logged {def log(msg: String) // This method is abstract}trait ShortLogger extends Logged {val maxLength = 15 // A concrete fieldoverride def log(msg: String){print("23")}def fun(){}}trait ShortLogger1 extends Logged { val maxLength = 16 // A concrete fieldoverride def log(msg: String){print("2sdf3")} def fun(){}}// 这里会报错,因为scala并不知道使用哪个maxLength属性和fun()方法,解决办法是 分别override覆盖maxLength属性和fun()方法class SavingsAccount extends ShortLogger with ShortLogger1{  /* override val maxLength = 17*/  }

groovy代码:

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")
结果:

162sdf3

总结:groovy的语法看上去更智能一点,但是它却强硬地帮我们做出了选择,后者一定会覆盖前者。而sacla看上去比较死板,如果需要用到多个特性并保留每个属性或方法,那么各个trait的属性名和方法名尽量不应该相同,可以加个前缀。


1 0
原创粉丝点击