filename: Primitives.kt/Number.kt
package: kotlin
基本和所有编程语言一样,基本数据类型有Byte/Short/Int/Long/Float/Double,且和Java一样都是有符号性的。
从源码可知所有基础类型都是实现了Number抽象类,Comparable接口。
如图,Number是所有数值类的父类,且提供了toXX的抽象方法。
Comparable就更简单了,如图:
是一个比较接口定义。
既然所有的基础类型定义都是差不多,那我们就选一个自然整数,Int作为分析吧,一窥Kotlin源码。
方法简略图如上图, 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 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有