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") } }
执行结果依然正确。
时间: 2024-10-08 09:09:23