我注意到了一件有趣的事
Java Integer.MAX_VALUE
是0x7fffffff
(2147483647)
Kotlin的Int.MAX_VALUE
是2147483647
但如果你写了
在爪哇:
int value = 0xFFFFFFFF;
//everything is fine (but printed value is '-1')
在Kotlin:
val value: Int = 0xFFFFFFFF //You get exception
The integer literal does not conform to the expected type Int
有趣吗?因此,您可以在Java中执行类似new java.awt.Color(0xFFFFFFFF, true)
的操作,但在Kotlin中执行不。
Color
类在"二进制"上使用该int。等级,所以一切都适用于所有构造函数(Color(int rgba)
或Color(int r, int g, int b, int a)
)的平台
我在kotlin找到的解决方法只有java.awt.Color(0xFFFFFFFF.toInt(), true)
。
知道Kotlin为什么会这样?
答案 0 :(得分:5)
部分回答here:
在Kotlin中,您需要在
-
符号前面加上表示负面的Int,这在Java中是不正确的。
因此,似乎Java会将十六进制文字解释为signed,而Kotlin会将它们视为无符号。
否定必须手动完成。
小旁白:JetBrains的Kotlin转换器实际上转换了
int a = 0xffffffff;
到
var a = -0x1
但这可能只是意识到你已经注意到了什么。
This particular part of the spec (overflow behavior) for hexadecimal literals被标记为TODO
,因此目前还没有官方规范(尚未)。
答案 1 :(得分:2)
我认为,应该通过 Kotlin 1.3 和UInt
解决此问题
在此处查看更多信息:https://kotlinlang.org/docs/reference/whatsnew13.html#unsigned-integers
答案 2 :(得分:0)
解释在reference docs:
由于表示不同,较小的类型不是子类型 更大的。如果是的话,我们会遇到以下问题 分类:
gradle.properties
因此,不仅身份,甚至平等都会默默地失去 到处都是。
因此,较小的类型不会隐式转换为更大的类型 类型。这意味着我们不能将类型Byte的值赋给Int 没有显式转换的变量。