我注意到,一件有趣的事情。
Java的Integer.MAX_VALUE
是0x7fffffff
(2147483647)
Kotlin的Int.MAX_VALUE
是2147483647
但是如果你写
在Java:
int value = 0xFFFFFFFF;
//everything is fine (but printed value is '-1')
在科特林:
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)
之类的操作
Color
类可与"二进制"级别上的INT一起使用,因此所有构造函数的平台都可以正常工作(Color(int rgba)
或Color(int r, int g, int b, int a)
)。
我为kotlin找到的唯一解决方法是 java.awt.Color(0xFFFFFFFF.toInt(), true)
。
任何想法在Kotlin中这样为什么?
这在这里部分回答:
在kotlin中,您需要预先准备
-
符号来表示Java中不正确的负int。
因此,Java似乎会将十六进制的文字解释为签名,而Kotlin则将其视为未签名。
必须手动完成否定。
小旁
int a = 0xffffffff;
to
var a = -0x1
,但这可能只是意识到您已经注意到了什么。
十六进制文字规格的一部分根本没有提及。
我认为,应该通过 kotlin 1.3 和UInt
解决此问题在此处查看更多:https://kotlinlang.org/docs/reference/whatsnew13.html#unsigned-integers
引用文档中的说明:
由于不同的表示,较小的类型不是亚型 更大的。如果是的话,我们会遇到以下问题 排序:
// Hypothetical code, does not actually compile: val a: Int? = 1 // A boxed Int (java.lang.Integer) val b: Long? = a // implicit conversion yields a boxed Long (java.lang.Long) print(a == b) // Surprise! This prints "false" as Long's equals() // check for other part to be Long as well
所以不仅身份,而且平等也会默默失去 到处都是。
因此,较小的类型不会隐式转换为较大 类型。这意味着我们无法将类型字节的值分配给int 无明确转换的变量。