当前位置 博文首页 > 残缺的歌的专栏:scala 与groovy 语法对比----长期更新
最近在学scala的同时也在接触groovy,因为每个语言都有很多相同点和不同点,拿出来比较就不容易混乱了。太基本的语法这里就不列出来对比了,只列出些遇到的比较重要的语法或者特性之间容易混淆的东西。
在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 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