文档章节

scala类型系统:类与类型

wiitht
 wiitht
发布于 2017/05/05 17:46
字数 812
阅读 1
收藏 0

类是对数据的抽象,而类型则是对数据的”分类”,类型比类更“具体”,更“细”一些。
类(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


在java1.5之后,因为引入了泛型的概念,类型系统变得复杂了,并且因为jvm选择了在运行时采用类型擦拭的做法(兼容性考虑),类型已经不能单纯的用class来区分了,比如 List<String> 和List<Integer> 的class 都是 Class<List>,然而两者类型(type)却是不同的。泛型类型的信息要通过反射的技巧来获取,同时java里增加了Type接口来表达更泛的类型,这样对于 List<String>这样由类型构造器和类型参数组成的类型,可以通过 Type 来描述;它和 List<Integer> 类型的对应的Type对象是完全不同的。

在Scala里,类型系统又比java复杂很多,泛型从一开始就存在,还支持高阶的概念(后续会讲述)。所以它没有直接用Java里的Type接口,而是自己提供了一个scala.reflect.runtime.universe.Type (2.10后)
scala中获取类型(Type):
scala> import scala.reflect.runtime.universe._ scala> class A scala> typeOf[A] res44: reflect.runtime.universe.Type = A

scala中获取类(class):
scala> classOf[A] res52: Class[A] = class A

typeOf 和 classOf 方法接收的都是类型符号(symbol),并不是对象实例
scala> trait T scala> classOf[T] res50: Class[T] = interface T scala> typeOf[T] res51: reflect.runtime.universe.Type = T
对于实例,要获取他的 Class 信息,只有通过 getClass 方法
scala> object O scala> classOf[O] // 这里O是一个单例对象 <console>:14: error: not found: type O
scala> O.getClass res60: Class[_ <: O.type] = class O$    

类型一致的对象它们的类也是一致的,反过来,类一致的,其类型不一定一致。
scala> classOf[List[Int]] == classOf[List[String]] res16: Boolean = true scala> typeOf[List[Int]] == typeOf[List[String]] res17: Boolean = false    

在jvm里,类的实例数据都是引用形式,而类型没有这个约束,基础类型int,byte,char等就是非引用的。(虽然可以通过int.class来获取Class对象,但并不能找到有定义class int的地方,这只是早期java为了统一用class来承载其类型信息的方式)
小结,类型是所有编程语言都有的概念,一切数据都有类型。类更多存在于面向对象语言,非面向对象语言也有“结构体”等与之相似的概念;类是对数据的抽象,而类型则是对数据的”分类”,类型比类更“具体”,更“细”一些。

 

© 著作权归作者所有

wiitht
粉丝 3
博文 158
码字总数 113941
作品 0
深圳
架构师
私信 提问
编程语言 Scala 2.12.0 正式版发布

编程语言 Scala 2.12.0 正式版发布了。 Scala 2.12.0编译器已经完全翻修,在Java 8中提供的新VM功能: trait使用默认方法直接编译到接口,这提高了二进制兼容性和Java互操作性。 Scala和Jav...

达尔文
2016/11/04
3.7K
15
Scala类型系统——高级类类型(higher-kinded types)

高级类类型就是使用其他类型构造成为一个新的类型,因此也称为 类型构造器(type constructors)。它的语法和高阶函数(higher-order functions)相似,高阶函数就是将其它函数作为参数的函数;高...

Barudisshu
2016/06/13
225
0
编程语言--Scala

Scala是一门现代的多范式编程语言,志在以简练、优雅及类型安全的方式来表达常用编程模式。它平滑地集成了面向对象和函数语言的特性。 Scala是面向对象的:Scala是一个纯面向对象语言,在某种...

匿名
2008/11/11
71.1K
12
大数据(十一)--Scala编程语言-提高

版权声明:本文版权归宋坤所有,转载请注明出处 https://blog.csdn.net/skisqibao/article/details/83750021 Scala Scala字符串 Scala 集合 trait特性 模式匹配match-case 样例类case classe...

skisqibao
2018/11/15
0
0
编程语言 Scala 2.12.0-M1 发布

Scala 2.12.0-M1 发布,Scala 2.12 系列的目标是 Java 8。 下载:scala-lang.org Maven Central Scala 2.12 改进计划: Java 8 style closures. Lambda syntax for SAM types New backend a......

oschina
2015/05/10
2.6K
16

没有更多内容

加载失败,请刷新页面

加载更多

HeyUI组件库按需加载功能上线,盘点HeyUI组件库有哪些独特功能?

HeyUI组件库 如果你还不了解heyui组件库,欢迎来我们的官网或者github参观。 官网 github 当然,如果能给我们一颗✨✨✨,那是最赞的了! 按需加载 当heyui组件库的组件越来越多的时候,按需...

vvpvvp
24分钟前
4
0
Dockerfile文件详解

Dockerfile文件详解 什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker bui...

Jeam_
37分钟前
0
0
阿里云PolarDB发布重大更新 支持Oracle等数据库一键迁移上云

5月21日,阿里云PolarDB发布重大更新,提供传统数据库一键迁移上云能力,可以帮助企业将线下的MySQL、PostgreSQL和Oracle等数据库轻松上云,最快数小时内迁移完成。据估算,云上成本不到传统...

zhaowei121
45分钟前
0
0
在数据数据探索过程中的一些常用操作

###pandas在做数据探索时,分组统计均值和中位数参考资料:http://www.cnblogs.com/nxld/p/6058591.htmlhttp://python.jobbole.com/85742/按字典重新赋值,可以直接使用pandas中的repla...

KYO4321
48分钟前
0
0
好程序员分享干货 弹性分布式数据集RDD

一、RDD定义 RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变(数据和元数据)、可分区、里面的元素可并行计算的集合。其特点在于自动容...

好程序员IT
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部