0

我想根据表格元素的条目索引提供实际页面。我用PageRequest.of(int page, int size).

我将indexwhich 传递给函数,还有一个常量PAGESIZE_SEARCH50。

我想根据索引传递当前页面如下:

PageRequest.of((int) index/PAGESIZE_SEARCH, PAGESIZE_SEARCH)

我的想法(IntelliJ Ultimate 2020.1.1)使我的铸造和暗示变灰Casting 'index' to 'int' is redundant。如果我删除演员表,即使编译器接受它,我也不会得到运行时异常。

为什么是这样?那里的分区不安全吗?任何解释将不胜感激。

4

2 回答 2

5

该部门并非不安全;它完全按照它应该做的那样做。

将两个整数相除称为整数除法,它只返回两个数字相除的结果,没有余数。

此外,正如评论中指出的那样,您实际上是在转换index为 int,而不是index/PAGESIZE_SEARCH- 考虑更准确地使用括号:(int) (index / PAGESIZE_SEARCH).

编辑:您可以在此处阅读有关此主题的更多信息。

于 2020-07-20T09:46:04.817 回答
5

从数学上讲,整数在除法下不是封闭的,这意味着将两个任意整数(如 3 和 5)相除的结果可能会导致无法用整数表示的结果。每个数学数字集(无论是 N、ℤ、ℚ、ℝ、ℂ)都有一定的局限性,并且这些集合在计算机中的每个表示也有局限性。了解这些限制是很重要的一点。

写。两个整数的除法不被关闭,你可以用五种不同的方式处理这个问题,从数学上讲:

  • 使除法成为部分功能。这对于必须处理任意输入的编程语言来说是不可取的。每次尝试对未定义除法的数字进行除法时,是否都会出现算术异常?不是一个很好的方法。
  • 使除法成为从整数到实数的函数。这实际上是您可以使用的一种方法,但实数在计算硬件中无法准确表示,因此只能在近似解中。它当然可以以这种方式实现编程语言,但实际上您更可能对整数结果感兴趣。
  • 以分数结果 (Q) 形式给出答案。例如 3/5 变为 ⅗,有时表示为元组 (3,5)。您可以在某些编程语言中执行类似的操作,例如 Haskell。
  • 给出商和余数的答案。一些编程语言会这样做,但 Java 不支持元组类型,也不支持多个返回值,所以这个已经过时了。这有时称为欧几里得除法
  • 只给出商作为答案,丢弃余数。这通常称为整数除法,是 Java 实现的。您可以通过相关的操作模运算符来恢复余数%

JLS 在§15.7.2中指定了除法的工作方式:

整数除法向 0 舍入。也就是说,在二进制数值提升(第 5.6.2 节)之后为整数的操作数 n 和 d 产生的商是一个整数值 q,其幅值尽可能大,同时满足 |d ⋅ q| ≤ |n|。此外,当 |n| 时 q 为正 ≥ |d| 并且 n 和 d 具有相同的符号,但是当 |n| 时 q 为负 ≥ |d| n 和 d 符号相反。

有一种特殊情况不满足此规则:如果被除数是其类型的最大可能量级的负整数,并且除数为-1,则发生整数溢出并且结果等于被除数。尽管溢出,在这种情况下不会抛出异常。另一方面,如果整数除法中除数的值为 0,则抛出 ArithmeticException。

此外,您实际上并没有将除法的结果转换为int. 你只是投射index到一个int. 强制转换是不相关且多余的,因为整数除法返回 an int,如上所述。

于 2020-07-20T09:55:00.270 回答