Android Studio 警告整数乘法隐式转换为 long。如何解决这个问题?
Posted
技术标签:
【中文标题】Android Studio 警告整数乘法隐式转换为 long。如何解决这个问题?【英文标题】:Android studio warns about integer multiplication implicitly cast to long. How to fix this? 【发布时间】:2021-10-12 20:19:00 【问题描述】: private static boolean isOverDate(long targetDate, int threshold)
return new Date().getTime() - targetDate >= threshold * 24 * 60 * 60 * 1000;
我正在使用上述功能,android Studio 会警告我:
threshold * 24 * 60 * 60 * 1000: integer multiplication implicitly cast to long
如何解决这个问题?为什么会发出警告?
【问题讨论】:
您在threshold
中的输入是什么?
因为你的targetDate
是long
?
我在两个地方使用这个函数,并分别将 10 和 1 作为阈值传递给它。
请注意,如果您使用现代的java.time
类,您的代码将更易于管理(并且不需要此方法)。
【参考方案1】:
好的,所以取消选择有点复杂。
在 >=
表达式的 LHS(左侧),我们有:
new Date().getTime() - targetDate
该表达式的类型是long
,因为targetDate
被声明为long
。
在 RHS 我们有:
threshold * 24 * 60 * 60 * 1000
这是一个int
,因为所有的操作数都是int
s。
但是,该表达式可能溢出。 24 * 60 * 60 * 1000
的值“相当大”,当您将其乘以 threshold
时,结果值可能太大而无法表示为 int
。如果它确实溢出,那么结果将被截断,>=
测试会给出错误的结果。
所以...编译器建议您应该使用long
算术进行 RHS 计算。简单的方法是将threshold
声明为long
。但您也可以将其转换为 long
,如下所示:
((long) threshold) * 24 * 60 * 60 * 1000
【讨论】:
不错的答案。我也在不同的问题中包含了你的答案。【参考方案2】:因为max_int
是2 147 483 648
。
如果您的threshold
大于 25 (25 * 24 * 60 * 60 * 1000 = 2.160.000.000),它将高于 int
可以容纳的值。所以你需要转换为long
,否则结果可能不正确。
参考:https://***.com/a/42671759/4316327
如果整数乘法溢出,则结果为 数学乘积的低位,如某些 足够大的二进制补码格式。结果,如果溢出 发生,则结果的符号可能与 两个操作数值的数学乘积。
解决方案:
long timeToCheck = threshold * 24 * 60 * 60 * 1000L;
return new Date().getTime() - targetDate >= timeToCheck;
或单行(这里不同的是L
在最后一个数字之后,它会理解你将类型更改为long
)
return new Date().getTime() - targetDate >= threshold * 24 * 60 * 60 * 1000L;
或铸造
return new Date().getTime() - targetDate >= (long) threshold * 24 * 60 * 60 * 1000;
【讨论】:
如何解决这个警告?或者只是将其转换为 long 可以解决这个问题? @ChaitanyaKarmarkar 不客气。我刚刚又更新了 1 次答案,让你和以后来的人都能明白这一点。 您应该考虑将第一个操作转换为long
而不是最后一个。以上是关于Android Studio 警告整数乘法隐式转换为 long。如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章
警告:从枚举类型“UIInterfaceOrientation”到不同枚举类型“UIDeviceOrientation”的隐式转换?