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")

  }

}

执行结果依然正确。

时间: 2024-10-08 09:09:23

scala如何解决类型强转问题的相关文章

类型强转和地址强转

1 例子 最近在干一个很复杂的事-读4w多行的项目源码,头都大了有木有!其中有一步是加载一个二进制文件,为了更好的理解代码的含义,我需要一点一点解析二进制文件.在解析到某个位置的时候,有个读浮点数的操作,对应的二进制值为:-CAF249F1-.非常好奇这个值对应的浮点数是多少,所以写代码去求解一下.这里我没有犯一个错误:原始的文件中是按照从低字节到高字节排序的,所以实际的数应该为:0xF149F2CA.但是还是犯了很多错误,最初的代码为: void test1() { unsigned int

Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/pR_4sY0cJLs/优酷:http://v.youku.com/v_show/id_

c++第十四章-(类型强转换)

类型强转换有2种. class Company { public: Company(std::string theName,std::string theProduct); virtual void printInfo(); protected: std::string name; std::string product; }; Company::Company(std::string theName,std::string theProduct) { this->name = theName;

Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/a6qIB7SqOlc/优酷:http://v.youku.com/v_show/id_

类型强转和字节对齐

当一个较少字节对齐类型的指针强转为一个较多字节对齐的指针类型时,这样有些时候会产生问题. 在arm的平台上,这个问题比较明显,在x86平台上运行后没这个问题 typdef struct { int addr; int rdda; }Test_t; int main() { short int a; short int s[2]; short int *pt = &s; Test_t tt; Test_t *pt = NULL; tt.addr= 0x11223344; memcpy(s,&

Scala学习 - 基础类型

Scala中的类型相对于Java来说,与.net的想法更为接近,所有的类型都是基于一个基础类型,包括值类型也是继承自该类型: Java中值类型是语言直接提供的,这点上有点不同: 类型关系图如下: 其中所有类型的基类与Any Any之后分为两个AnyVal与AnyRef 其中AnyVal是所有值类型的父类型 AnyRef是所有引用类型的父类型 与其他语言稍微有点不同的是,Scala还定义了底类型 其中Null类型是所有引用类型的底类型,及所有AnyRef的类型的空值都是Null 而Nothing是

cocos2dx lua 类型强转

lua 里,类型强转 local widget = Widget:create() local node = widget:getWidgetWithName("lab"); --node 类型是:Widget local button = tolua.cast(node, "Button") -- Widget 类型转为:Button

python类型强转&amp;二级容器

Number 类型强转 int :         ---->>>   float,  bool,  complex,  str Float :        ---->>>           int(舍弃小数位),  bool,  complex, str Complex :  ---->>>             str,  bool Bool :          ---->>>             str,  int,

[Scala基础系列 10]Scala泛型、类型边界

1.泛型和类型边界 1.1.上限(upper bounds) 我们先看一个简单的实例,用于判断两个变量中较大的值,其中两个变量的类型均为Int型 package com.tv189.advanced /** * Created by molyeo on 2015/8/12. */ class PairInt(val first: Int, val second: Int) { def bigger = { if (first.compareTo(second) > 0) first else s