首页 > 解决方案 > Kotlin Int 的 8 个十六进制数字超出范围,但适用于 java int

问题描述

我正在开发一个获得颜色(作为 32 位数字)的 Android 应用程序,我想使用 Android 来展示它 Drawable

我还想确保没有透明度,所以我OR使用了一个设置了最高有效位的掩码。

我的应用程序是用 Kotlin 编写的,所以这个数字是Int类型的。

在Java中,我认为以下工作

int colorInt = myColor || 0xFF000000;

我用 Kotlin 尝试了以下操作

var colorInt:Int = myColor or 0xFF000000 // Error - Integer literal does not conform to the expected type of Int

这抱怨0xFF000000超出范围Int

我可以UInt为此使用 a ,但是如果我通过 ,Drawable该类和许多其他 SDK 方法接受Int颜色并抱怨类型UInt。例如,如果我想在 a 中使用 2 种颜色GradientDrawable,则构造函数接受IntArray并且不会与 a 一起使用UIntArray。(据我所知,无符号类型在 Kotlin 中是实验性的,所以我不想在更新 Kotlin 版本后四处“修复”这些。)

我可以-0xFFFFFF在 Kotlin 中使用,并且在这种情况下似乎可以正常工作,尽管可以说我正在做的事情不如 java 版本那么明显。

我想了解处理这种情况的最佳方法,以及 java 和 kotlin 中存在这种差异的原因。

标签: javaandroidkotlinunsigned-integer

解决方案


从 Kotlin 1.3 开始,您可以使用带符号的无符号整数 ()Int(因此十六进制0xFF000000超出范围)。现在你可以试试:

// UInt instead of Int
// u suffix at the end of number
val m:UInt = 0xFF000000u

推荐阅读