前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kotlin源码阅读——基础数据类型

kotlin源码阅读——基础数据类型

原创
作者头像
Runhwguo
修改2018-09-11 20:01:30
1.2K0
修改2018-09-11 20:01:30
举报

filename: Primitives.kt/Number.kt

package: kotlin

基本和所有编程语言一样,基本数据类型有Byte/Short/Int/Long/Float/Double,且和Java一样都是有符号性的。

从源码可知所有基础类型都是实现了Number抽象类,Comparable接口。

如图,Number是所有数值类的父类,且提供了toXX的抽象方法。

Comparable就更简单了,如图:

是一个比较接口定义。

既然所有的基础类型定义都是差不多,那我们就选一个自然整数,Int作为分析吧,一窥Kotlin源码。

Int class的方法简略图
Int class的方法简略图

方法简略图如上图, companion里,定义Int的最值,其它的都是opertator的实现。

这里的operator都是为了增强语义而起得名字,如minus、div等。

我觉得对一个原理如果称得上为理解的话,是应该能扩展原有类,或者是能自己新建类。

下面来扩展一个Int类,先看下Int是否有没有满足需求的呢?

如图,我们发现operator的plus只能+基础数据类型,不能+字符串的数据,如果想让Kotlin拥有动态能力,int与string直接计算,源码显然是满足不了的。

让我们来扩展下。

这里还有一个疑问,就是Int源码不是抽象类,而是一个可实例化的类,那么数值操作的具体实现在哪里呢?

Google + 看源码(Kotlin是开源的)!

官方链接:https://discuss.kotlinlang.org/t/kotlin-primitives-source-code/2469

基础类型是在compiler编译器里,直接实现的,转换为jvm的字节码。

+-*/%等操作是Kotlin语言固有的,是由jvm实现的,Int的rem在jvm上翻译为irem字节码,在js中翻译为%。

源代码:

compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicMethods.java

从源码里,我们可以看出这些基础操作是编译器后端内部实现的。

更深入的,请见源码。

至此我们清楚了Kotlin里的Primitives基础类型,是怎么回事了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档