Java Integer.MAX_VALUE vs Kotlin Int.MAX_VALUE



我注意到,一件有趣的事情。
Java的Integer.MAX_VALUE0x7fffffff(2147483647)
Kotlin的Int.MAX_VALUE2147483647
但是如果你写
在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 无明确转换的变量。

最新更新