簡體   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