繁体   English   中英

Java Integer.MAX_VALUE 与 Kotlin Int.MAX_VALUE

[英]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) ,但在 Kotlin 中则不能

Color类在“二进制”级别与该 int 一起使用,因此对于具有所有构造函数( Color(int rgba)Color(int r, int g, int b, int a) )的两个平台,一切都正常。
我为 kotlin 找到的唯一解决方法是java.awt.Color(0xFFFFFFFF.toInt(), true)

知道为什么在 Kotlin 中会这样吗?

这是部分回答here

在 Kotlin 中,您需要在前面加上-符号来表示负 Int,这在 Java 中是不正确的。

因此,Java 似乎会将十六进制文字解释为signed ,而 Kotlin 会将它们视为 unsigned 。

否定必须手动完成。

小题大做:JetBrains 的 Kotlin 转换器实际上可以转换

int a = 0xffffffff;

var a = -0x1

但这可能只是它完全意识到你注意到了什么。


然而,十六进制文字的规范部分根本没有提到这一点。

我认为,这个问题应该由Kotlin 1.3UInt来解决,请在此处查看更多信息: 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

因此,不仅身份,甚至平等都会无声无息地消失在整个地方。

因此,较小的类型不会隐式转换为较大的类型。 这意味着我们不能在没有显式转换的情况下将 Byte 类型的值分配给 Int 变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM