众所周知在很多面向对象的语言中,抽象类都是不可以直接实例化的,必须另写一个类继承实现这个抽象类之后再实例化这个子类,Scala也不例外。
abstract class Car{
def drive()
def color
}
val car1 = new Car {}
这段代码是无法编译通过的,因为在Scala中,无论是抽象类和特质,只要存在没有实现的方法或属性,都是无法直接实例化的。注意,这里提到了没有实现的方法和属性,可以看下面的代码
trait Car{
def drive() = {}
def color = "red"
}
val car1 = new Car {}
上面这段代码是可以编译通过的,因为虽然它是特质,但是方法和属性都实现了,就可以当作普通类来实例化
如果有时候的确需要直接实例化 “没有实现方法的抽象类或特质”,该怎么办呢?这就引出了今天的主角——匿名子类,用法如下
abstract class Car{
def drive()
def color
}
val car1 = new Car {
override def drive(): Unit = {
println("drive")
}
override var color = "red"
}
在new关键词后面直接跟上方法和属性的实现代码就可以了
匿名子类可以极大提高代码的灵活性,Scala中有广泛应用,如下所示
implicit val ord = new Ordering[String] {
override def compare(x: String, y: String) : Int = {
y.compareTo(x)
}
}
val arr = Array("a", "g", "F", "B", "c")
val sortedArr = arr.sorted
sortedArr.foreach(println)
这段代码对array的元素进行排序,sorted会传入一个隐式参数,而这个隐式参数 ord 就是特质Ordering的一个匿名子类(实现了compare方法),其中compare可由开发者自行实现符合自己排序的逻辑,这也是精髓所在。