scala如何解決類型強轉問題
scala屬於強類型語言,在指定變量類型時必須確定數據類型,即便scala擁有引以為傲的隱式推到,這某些場合也有些有心無力。
例如:
java同屬強類型語言,但java可以進行類型強轉。因此在進行面向接口編程時,借助類型強轉,只要編碼沒有問題,就可以使用准備使用的class類。但在scala中,這條路就走不通了。因為scala沒有類型強壯。
那如何辦呢?
眾所周知,scala編譯后變成字節碼文件,運行在jvm中。那么從骨子里,scala可以說是脫胎於java,同樣scala可以調用java所有的類庫。既然如此,如果在java中不借助類型強轉,又如何完成同樣的事情呢?
結果是:反射!
下面我們定義一個接口類:
ScalaInter
trait ScalaInter { def myOut(str:String) }
然后定義兩個實現類:
ScalaClass
class ScalaClass extends ScalaInter { def myOut(str:String)={ println("class1=="+str) } }
ScalaClass2
class ScalaClass2 extends ScalaInter { def myOut(str:String)={ println("class2=="+str) } }
下面我們要做的就是通過放射完成類型強轉的功能:
object ScalaTest { def main(args: Array[String]): Unit = {
var er = Class.forName("org.andy.rtbd.run.ScalaClass2").newInstance().asInstanceOf[ScalaInter]
er.myOut("ddd") } }
首先通過反射得到一個基類,而后通過asInstanceOf得到運行時類對象。
執行結果如下:
class2==ddd
或者我們可以換成java版本的結果方案:
object ScalaTest { def main(args: Array[String]): Unit = { var er = Class.forName("org.andy.rtbd.run.ScalaClass2").newInstance() var b = classOf[ScalaInter].cast(er) b.myOut("ddd") } }
執行結果依然正確。