Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >kotlin源码阅读——基础数据类型

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

原创
作者头像
Runhwguo
修改于 2018-09-11 12:01:30
修改于 2018-09-11 12:01:30
1.3K0
举报

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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
android-ipc介绍
按照操作系统中的描述 线程是CPU调度的最小单元 同时线程是一种有限的系统资源 进程一般指一个执行单元 在PC和移动设备上指一个应用 一个进程可以包含多个线程 因此进程和线程是包含与被包含的关系 最简单的情况下一个进程中可以只有一个线程即主线程 在Android里面主线程也叫UI线程 在UI线程里才能操作界面元素
tea9
2022/07/16
4600
android-ipc介绍
Android项目实战(十九):Android Studio 优秀插件: Parcelable Code Generator                       Android Studi
Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat Android Studio 优秀插件(二): Parcelable Code Generator ----------------------------------------------------------------------------- Parcelable  , 这个词大家应该不陌生吧,用于序列化对象的一个接口 不清楚的可以看一下这篇博客:Intent传递对象的两种方法
听着music睡
2018/05/18
1.5K0
Android十八章:多进程基础
这一章主要讲述多进程的作用,序列化和反序列化,Serializable和Parcelable
ppjun
2018/09/05
4750
android之Parcelable介绍
Parcelable类的概述在SDK中是这样的:这些类的接口可以将实例写入或从中还原 Parcel。
李小白是一只喵
2020/12/31
6590
安卓中Serializable 比 Parcelable好在哪?
(3)在安卓中使用 Intent 进行传输时候,数据类型较为复杂的需要进行序列化操作 。
没关系再继续努力
2021/11/11
4920
Android中的序列化:Parcelable和Serializable
概述 序列化:将一个对象转换成 可存储或 可传输的状态。 Parcelable和Serializable的区别 作用 Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。 Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。 性能比
用户1205080
2018/12/21
7990
Serializable和Parcelable的再次回忆
自己开发Android也有些时间了,Serializable和Parcelable遇到过不止一次了。但是每次别人问起具体的内容自己偏偏记得不是很清晰。因为某些原因再次梳理一下,以文章的形式给自己存储下来。温故而知新!!
静默加载
2020/05/31
6100
AIDL源码解析in、out和inout
为什么会想写这篇文章,只因为一个error idl.exe E 4928 5836 type_namespace.cpp:130] 'Book' can be an out type, so you must declare it as in, out or inout. 看过上一篇文章Android:IPC之AIDL的学习和总结的同学都知道这是因为在AIDL文件中使用非常规类型作为参数传递的时候没有标记指向tag,那么到底为什么会是这样子的呢,作为一个好奇宝宝我想好好看看。
静默加载
2020/05/29
1.9K0
AS插件-Android Parcelable code generator.
输入 Android Parcelable code generator ,点击安装即可,安装之后 重启,会看到上图选中部分所示。
小小工匠
2021/08/16
4180
android一个弹出菜单的动画(二)「建议收藏」
代码:http://download.csdn.net/detail/baidu_nod/7731115
全栈程序员站长
2022/07/08
5440
android一个弹出菜单的动画(二)「建议收藏」
parcel和parcelable
Parcel 在英文中有两个意思,其一是名词,为包裹,小包的意思; 其二为动词,意为打包,扎包。邮寄快递中的包裹也用的是这个词。Android采用这个词来表示封装消息数据。这个是通过IBinder通信的消息的载体。需要明确的是Parcel用来存放数据的是内存(RAM),而不是永久性介质(Nand等)。 Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。 接口的
xiangzhihong
2018/01/30
9250
Java IO之对象的序列化、ObjectInputStream和ObjectOutputStream类
Java将数据从源(文件、内存、键盘、网络)读入到内存 中,形成了流,然后将这些流还可以写到另外的目的地(文件、内存、控制台、网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分。按照不同的分类标准,IO流分为不同类型。主要有以下几种方式:按照数据流方向、数据处理的单位和功能。
用户7886150
2021/04/25
1.1K0
Android:IPC之AIDL的学习和总结
为了使得一个程序能够在同一时间里处理许多用户的要求。即使用户可能发出一个要求,也肯能导致一个操作系统中多个进程的运行(PS:听音乐,看地图)。而且多个进程间需要相互交换、传递信息,IPC方法提供了这种可能。IPC方法包括管道(PIPE)、消息排队、旗语、共用内存以及套接字(Socket)。
静默加载
2020/05/29
1.4K0
Android Parcelable
Interface for classes whose instances can be written to and restored from a Parcel. 
阳光岛主
2019/02/19
6260
Art of Android Development Reading Notes 2
(1)任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道、共享内存、信号量等来进行进程间通信。 (2)Android系统不仅可以使用Binder机制来实现IPC,还可以使用Socket实现任意两个终端之间的通信。
宅男潇涧
2018/08/01
5220
Art of Android Development Reading Notes 2
Parcelable与Serializable
由于 Java 的 Serializable 的性能较低,Parcelable 正式在这个背景下产生的,它核心作用就是为了解决 Android 中大量跨进程通信的性能问题。
老马的编程之旅
2022/06/22
1.2K0
Android开发笔记(二十七)对象序列化
程序中存储和传递信息,需要有个合适的数据结构,最简单的是定义几个变量,变量多了之后再分门别类,便成了聚合若干变量的对象。代码在函数调用时可以直接传递对象,但更多的场合例如与文件交互、与网络交互、组件之间交互等等,就无法直接使用未经处理的对象。因此Java引入了序列化的概念,用于把一个对象转换为字节序列,然后再对这个字节序列做存储和传递操作。与之对应的是反序列化,反序列化是把一个字节序列恢复为Java对象的过程,而序列化是把Java对象转化为字节序列的过程。
aqi00
2019/01/18
6620
Android序列化总结
公园里,一位仙风鹤骨的老者在打太极,一招一式都仙气十足,一个年轻人走过去:“大爷,太极这玩意儿花拳绣腿,你练它干啥?”老者淡淡一笑:“年轻人,你还没有领悟到太极的真谛,这样,你用最大力气打我试试。”于是年轻人用力打了老头一拳,被讹了八万六。
大公爵
2018/09/05
8460
Android序列化总结
彻底理解Serializable和Parcelable
这里有二个关键字,存储和传输,存储的场景比如对象的持久化,传输的场景比如将对象通过网络传输,然后在需要使用的时候,反序列化,重新创建对象。
三好码农
2019/03/15
1.2K0
Android技能树 — 多进程相关小结
这次是讲Android存储路径及IO的基本操作。因为我们在开发的时候会经常这种方便的需求。这篇文章的内容我写的可能很少,都没有细写。别吐槽。o( ̄︶ ̄)o
青蛙要fly
2018/08/29
4570
Android技能树 — 多进程相关小结
相关推荐
android-ipc介绍
更多 >
加入讨论
的问答专区 >
1合伙人擅长4个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档