前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >scala如何解决类型强转问题

scala如何解决类型强转问题

作者头像
随机来个数
发布于 2018-04-16 07:41:43
发布于 2018-04-16 07:41:43
1.9K00
代码可运行
举报
文章被收录于专栏:写代码的海盗写代码的海盗
运行总次数:0
代码可运行

scala如何解决类型强转问题

  scala属于强类型语言,在指定变量类型时必须确定数据类型,即便scala拥有引以为傲的隐式推到,这某些场合也有些有心无力。

  例如:

    java同属强类型语言,但java可以进行类型强转。因此在进行面向接口编程时,借助类型强转,只要编码没有问题,就可以使用准备使用的class类。但在scala中,这条路就走不通了。因为scala没有类型强壮。

  那如何办呢?

  众所周知,scala编译后变成字节码文件,运行在jvm中。那么从骨子里,scala可以说是脱胎于java,同样scala可以调用java所有的类库。既然如此,如果在java中不借助类型强转,又如何完成同样的事情呢?

  结果是:反射

  下面我们定义一个接口类:

  ScalaInter

trait ScalaInter { def myOut(str:String) }

  然后定义两个实现类:

  ScalaClass

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ScalaClass extends ScalaInter {
    def myOut(str:String)={
      println("class1=="+str)
    }
}

  ScalaClass2

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ScalaClass2 extends ScalaInter {
    def myOut(str:String)={
      println("class2=="+str)
    }
}

  下面我们要做的就是通过放射完成类型强转的功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object ScalaTest {

  def main(args: Array[String]): Unit = {
    var er = Class.forName("org.andy.rtbd.run.ScalaClass2").newInstance().asInstanceOf[ScalaInter]
    er.myOut("ddd")
          
  }

}

  首先通过反射得到一个基类,而后通过asInstanceOf得到运行时类对象。

  执行结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class2==ddd

  或者我们可以换成java版本的结果方案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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")
          
  }

}

  执行结果依然正确。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-08-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
scala 类型 的最详细解释
1.5 后引入了泛型,jvm 选择运行时擦除类型, 类型不可以只通过类信息进行判断. 比如: List<String>,List<Integer> 的class 都是 Class<List>,然而他们的类型是不相同的,泛型是需要通过反射来进行获得, 同时java通过增加 Type 来表达这种类型.
Tim在路上
2020/08/05
8860
如何做Spark 版本兼容
同理对应的Vectors object 也是。这就造成了一个比较大的困难,比如下面的代码就很难做到兼容了,切换Spark就无法通过编译:
用户2936994
2018/08/27
9950
带你快速掌握Scala操作———(5)
类继承了多个trait后,可以依次调用多个trait中的同一个方法,只要让多个trait中的同一个方法在最后都依次执行super关键字即可。类中调用多个tait中都有这个方法时,首先会从最右边的trait方法开始执行,然后依次往左执行,形成一个调用链条。
刘浩的BigDataPath
2021/04/13
5390
带你快速掌握Scala操作———(5)
2021年大数据常用语言Scala(三十):scala面向对象 继承(extends)
scala和Java一样,使用extends关键字来实现继承。可以在子类中定义父类中没有的字段和方法,或者重写父类的方法。
Lansonli
2021/10/11
5390
scala(十二) 特质
Scala语言中,采用特质(trait)来代替接口的概念,也就是说,多个类具有相同的特质(trait)时,就可以将这个特质(trait)独立出来,采用关键字trait声明。
用户1483438
2022/04/18
5500
scala与java之间的那些事
  scala与java之间的关系,我认为可以用一句话来开头:scala来源于java,但又高于java。   scala的设计者Martin Odersky就是一个JAVA控,这位牛人设计了javac和编写了jdk中的通用代码。可以说java语言本身就是Martin Odersky一步一步看着长大的。所以scala可以说打根起就和JAVA有着远远悠长的血缘关系。   Martin Odersky还在写java那会,就立志开发达成一个目标:让写程序这样一个基础工作变得高效、简单、且令人愉悦!因此可以说sca
随机来个数
2018/04/16
9620
Scala 【 8 面向对象编程 - 继承 】
继承就代表,子类可以从父类继承父类的 field 和 method 。子类可以在自己内部放入父类所没有的子类特有的 field 和 method 。
Lokinli
2023/03/09
3830
大数据利器--Scala语言学习(基础)
在 Scala 当中,函数是一等公民,像变量一样,既可以作为函数的参数使用,也可以将函数赋值给一个变量. ,函数的创建不用依赖于类或者对象,而在 Java 当中,函数的创建则要依赖于类、抽象类或者接口。
MiChong
2020/09/24
1K0
大数据利器--Scala语言学习(基础)
在Scala项目中使用Spring Cloud
由于Scala本身属于JVM下的语言,因此它能够较好地与Java项目融合在一起。在Scala中调用Java库,基本上与在Java中调用Java库的方式是相同的(反过来则未必,必将Java没有Scala中独有的语法糖)。因此,在Scala中可以非常方便地调用Spring Cloud,使其支持Spring Cloud提供的微服务基础设施,例如Eureka、Feign以及Spring Boot等。 不过仍然有几点需要注意,这些方面包括: Maven依赖 Spring的语法 Json的序列化 Maven依赖 在Sc
张逸
2018/03/07
1.7K0
在Scala项目中使用Spring Cloud
Scala学习二-面向对象
适用于var变量,对于val不适用,注意如果使用下划线进行初始化,此时必须提供数据类型,这样就可以进行自动推断赋初始值
路行的亚洲
2020/10/26
8940
SparkContext初始化过程
SparkContext在构造的过程中,已经完成了各项服务的启动。因为Scala语法的特点,所有构造函数都会调用默认的构造函数,而默认构造函数的代码直接在类定义中。 除了初始化各类配置、日志之外,最重要的初始化操作之一是启动Task调度器和DAG调度器,相关代码如下: // 创建并启动Task调度器 val (sched, ts) = SparkContext.createTaskScheduler(this, master) _schedulerBackend = sched _taskScheduler
天策
2018/06/22
7070
大数据技术之_16_Scala学习_12_设计模式+泛型、上下界、视图界定、上下文界定、协变逆变不变
第十七章 设计模式17.1 学习设计模式的必要性17.2 掌握设计模式的层次17.3 设计模式的介绍17.4 设计模式的类型17.5 简单工厂模式(生产类)17.5.1 基本介绍17.5.2 看一个具体的需求17.5.3 使用传统的方式来完成17.5.4 使用简单工厂模式来完成17.6 工厂方法模式(生产方法)17.6.1 看一个新的需求17.6.2 工厂方法模式介绍17.6.3 工厂方法模式应用案例17.7 抽象工厂模式(生产类)17.7.1 基本介绍17.7.3 抽象工厂模式应用案例17.8 工厂模式小结17.9 单例模式17.9.1 什么是单例模式+单例模式的应用场景17.9.2 单例模式的应用案例-懒汉式17.9.2 单例模式的应用案例-饿汉式17.10 装饰者模式(Decorator)17.10.1 看一个具体的需求17.10.2 方案1-较差的方案+小结和分析17.10.3 方案2-好点的方案+小结和分析17.10.4 装饰者模式原理17.10.5 装饰者模式定义17.10.6 用装饰者模式设计重新设计的方案17.10.7 装饰者模式咖啡订单项目应用实例17.10.8 Java 中装饰者模式的经典使用17.11 观察者模式(Observer)17.11.1 看一个具体的需求17.11.2 气象站设计方案1-普通方案17.11.3 观察者模式原理17.11.4 气象站设计方案2-观察者模式17.11.5 Java 内置观察者模式17.12 代理模式(Proxy)17.12.1 代码模式的基本介绍17.12.2 看一个具体的需求17.12.3 完成监控本地糖果机17.12.4 完成监控远程糖果机17.12.6 Java RMI实现远程代理17.12.7 使用远程代理模式完成远程糖果机监控17.12.8 动态代理17.12.9 几种常见的代理模式介绍-几种变体第十八章 泛型、上下界、视图界定、上下文界定、协变逆变不变18.1 泛型18.2 类型约束-上界(Upper Bounds)/下界(Lower Bounds)18.3 类型约束-视图界定(View Bounds)18.4 类型约束-上下文界定(Context Bounds)18.5 协变、逆变和不变
黑泽君
2019/04/18
8880
大数据技术之_16_Scala学习_12_设计模式+泛型、上下界、视图界定、上下文界定、协变逆变不变
Scala最基础入门教程
(1)Scala和Java一样属于JVM语言,使用时都需要先编译为class字节码文件,并且Scala能够直接调用Java的类库。
ha_lydms
2023/09/29
7150
Scala最基础入门教程
Spark基础-scala学习(二、面向对象)
面向对象编程之类 //定义一个简单的类 scala> :paste // Entering paste mode (ctrl-D to finish) //类默认public的 class HelloWorld{ private var name = "leo" def sayHello(){print("Hello,"+name)} def getName = name } // Exiting paste mode, now interpreting. defined class Hel
老梁
2019/09/10
6810
Scala 谜题 - 有趣的类型转换
在 Scala 中,List[String] 和 List[Int] 之间并没有继承关系,但是下面的代码竟然可以通过编译并且顺利运行: object Test extends App { val strList: List[String] = List("a", "b", "c") val strToIntList: List[Int] = strList.asInstanceOf[List[Int]] println(strToIntList) } 输出: //输出: List(a, b, c
joymufeng
2018/05/17
7920
scala(二) 变量与数据类型
scala 注释 与 java 完全一样 // 单行注释 /*...*/ 多行注释 /**...*/ 文本注释注释
用户1483438
2022/04/11
1.3K0
Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private var name = "张三"; def hello(): Unit ={ println("hello : " + name) } //注:如果定义方法
别先生
2018/04/02
1.1K0
02.Scala:面向对象、Object、抽象类、内部类、特质Trait
scala是支持面向对象的,也有类和对象的概念。我们依然可以基于scala语言来开发面向对象的应用程序。
Maynor
2021/04/09
1.2K0
反射相关
反射是Java程序开发语言的特征之一,它允许运行中的Java程序获取自身的信息,并且可以操作类或对象的内部属性。
Li_XiaoJin
2022/06/10
1490
scala(九) 封装、继承与多态
封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。 java封装操作如下:
用户1483438
2022/04/14
6950
相关推荐
scala 类型 的最详细解释
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文