在scala中的object類似java中的static一樣,其實反編譯之後就可以看到也是一個類,只不過名稱爲原來的名稱最後再加了一個$,我們一般沒有用到一個繼承自abstract class的object,我也是查看GenTraversable.scala源碼中發現這樣的用法:
GenTraversable.scala中 object GenTraversable extends GenTraversableFactory[GenTraversable]
所以我做了一個實驗,代碼如下:
object ObjectExtendsAbstractClass {
def main(args: Array[String]): Unit = {
val v = Conversions.milesToKilometers(10)
println(v) //16.0
var ucv:UnitConversions = Conversions //這個地方不能用new,不管哪種寫法我都無法new成功,只能用object的名字才OK
println(ucv.milesToKilometers(3)) //4.800000000000001
val iu1 = ucv.createinst
val iu2 = ucv.createinst
println(iu1)
println(iu2)
println(iu1 == iu2)
val iu3 = ucv.createinst2
val iu4 = ucv.createinst2
println(iu3)
println(iu4)
println(iu3 == iu4)
//scala.joe.com.implicits.Conversions$@76a4d6c
//scala.joe.com.implicits.Conversions$@76a4d6c
//true
//scala.joe.com.implicits.Conversions$@76a4d6c
//scala.joe.com.implicits.Conversions$@76a4d6c
//true
//
}
}
// GenTraversable.scala中 object GenTraversable extends GenTraversableFactory[GenTraversable]
//通過查看源代碼發現這個語法就是object extends abstract class形式
object Conversions extends UnitConversions
{
override def inchesToCentimeters(inches:Int) = inches * 2.5
override def gallonsToLiters(gallons:Int) = gallons * 3.78
override def milesToKilometers(miles:Int) = miles * 1.6
override def createinst: UnitConversions = this
override def createinst2: UnitConversions = Conversions
}
abstract class UnitConversions
{
def inchesToCentimeters(inches:Int):Double
def gallonsToLiters(gallons:Int):Double
def milesToKilometers(miles:Int):Double
def createinst:UnitConversions
def createinst2:UnitConversions
}