千家信息网

如何使用scala classOf、typeOf、object

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"如何使用scala classOf、typeOf、object"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家
千家信息网最后更新 2026年11月03日如何使用scala classOf、typeOf、object

本篇内容介绍了"如何使用scala classOf、typeOf、object"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

java里 jvm在运行时采用类型擦拭的做法,类型已经不能单纯的用class来区分了,比如 List 和 List 的class 都是 Class,然而两者类型(type)却是不同的。

在Scala里,类型系统又比java复杂很多,它自己提供了一个scala.reflect.runtime.universe.Type

在scala用typeOf获取类型信息:

scala> import scala.reflect.runtime.universe._

scala> class A

scala> typeOf[A]

res44: reflect.runtime.universe.Type = A

同样scala里获取类(Class)信息也很便捷:

scala> classOf[A]

另外,因为 java 的Object里提供了getClass方法,对于scala 对象来说,也可以用

scala> val a = new A

scala> a.getClass

res53: Class[_ <: A] = class A

注意,typeOf 和 classOf 方法接收的都是类型符号,并不是对象实例

scala> object O

scala> classOf[O] // 这里O是一个单例对象,是一个实例

:14: error: not found: type O

对于实例,要获取他的 Class 信息,只有通过 getClass 方法

scala> O.getClass

res60: Class[_ <: O.type] = class O$

注意到了,上面的 单例对象O 对应的class是 O$ ,你通过 :javap O 也能看到这个单例反编译后是一个名为O$的 java class

看上面的返回类型里 用:O.type 表示其类型;实际上 .type之前的都可以看做是一种类型路径,每个实例都可以通过.type方式表达它的单例类型

再举一个例子:

scala> class A { class B } // 嵌套类

scala> val a1 = new A

scala> val a2 = new A

scala> val b1 = new a1.B

scala> val b2 = new a2.B

对于内部类B的实例,它们的class都是相同的: A$B(表示B是A的内部类)

scala> b1.getClass

res8: Class[_ <: a1.B] = class A$B

scala> b1.getClass == b2.getClass

res7: Boolean = true

而它们的类型却是不同的:

scala> typeOf[a1.B] == typeOf[a2.B]

res10: Boolean = false

这是因为内部类型依赖外部实例(路径依赖类型),外部实例不同,它们也不同。

但还可以对这种类型再抽象

scala> typeOf[a1.B] <:< typeOf[A#B]

res11: Boolean = true

scala> typeOf[a2.B] <:< typeOf[A#B]

res12: Boolean = true

这里A#B涉及到类型投影的概念,如前所讲。

简单的说,类(class)与类型(type)是两个不一样的概念 (在java里因为早期一直使用class表达type,并且现在也延续这样的习惯);类型(type)比类(class)更"具体",任何数据都有类型。类是面向对象系统里对同一类数据的抽象,在没有泛型之前,类型系统不存在高阶概念,直接与类一一映射,而泛型出现之后,就不在一一映射了。比如定义class List[T] {}, 可以有List[Int] 和 List[String]等具体类型,它们的类是同一个List,但类型则根据不同的构造参数类型而不同。

scala> classOf[List[Int]] == classOf[List[String]](类型擦除)

res16: Boolean = true

scala> typeOf[List[Int]] == typeOf[List[String]]

res17: Boolean = false

在jvm里,类的实例都是引用形式,而类型没有这个约束,基础类型int,byte,char等就是非引用的。类型比类更"具体",更"细"一些。

"如何使用scala classOf、typeOf、object"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

类型 实例 不同 对象 信息 方法 概念 系统 内容 实际 数据 更多 知识 路径 面的 便捷 复杂 实用 相同 学有所成 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技名片 互联网科技公司的优势 厦门中拓互联网络科技有限公司 涨乐互联网科技 金融科技还是互联网 易互联网科技有限公司 致骋互联网科技 互联网金融科技创新 融贸通互联网科技 互联网高科技股票 互联网科技生活的内容 山东吉时兔互联网科技有限公司 互联网汽车科技小镇 互联网科技创新服务 佳云科技和互联网广告 青岛科技大学互联网大赛研究生 互联网科技包装股份有限公司上市 陕西九四连强互联网科技有限公司 陕西彩京云互联网科技有限公司 科技发展第三阶段互联网时代 重生之互联网科技帝国 互联网扶贫科技 广州互联网科技公司 哈尔滨秒房互联网科技有限公司 常德市电业局互联网科技部 互联网对科技的发展 996高科技互联网公司 南博望互联网科技有限公司 梅州GM互联网络科技有限公司 河南商务圈互联网科技有限公司
0