【问题标题】:Why can't I pass in java an array of short to method accepting array of int?为什么我不能在 java 中传递一个 short 数组来接受 int 数组的方法?
【发布时间】:2014-04-09 13:13:50
【问题描述】:

我有一个方法,它接受 int[] 参数。我想给它传递一系列短裤。但我得到的只是“不兼容的类型:short[] 无法转换为 int[]”。这是为什么? 一个例子:

short[] arr = new short[2];
arr[0] = 8;
arr[1]=9;
example(arr);

example(int[] anArray){
}

据我所知,short to int 只是在扩大,所以应该自动进行类型转换,不是吗? 那怎么通过呢? 谢谢。

【问题讨论】:

  • 您的问题已经得到了一些很好的 Java 特定答案。但是您认为short[]int[] 会相互关联,因为shortint 似乎是相关的这一事实是完全合理的。如果您想了解(方式)更多关于这类问题的信息,请从en.wikipedia.org/wiki/… 开始。
  • 从技术上讲,Java 可能会处理这个问题,因为数组(几乎)是成熟的对象,因此读/写数组元素的操作知道(或可能是)实际数组元素类型。所以至少部分答案是C不能处理同样的场景,Java是仿照C的。这样的改变是好是坏很难判断。 (但它在 Java 中永远不会改变——也许是一些后续语言。)

标签: java arrays parameter-passing


【解决方案1】:

您不能这样做,因为short[] 不是int[]。此外,short 不是int,只是Java 允许原始扩展转换以允许将short 扩展为int。但是,对于原始类型的数组,没有这种原始扩展转换。

这迫使一些核心 Java API 接受许多不同类型的原始数组,例如 Arrays.sort,它为许多不同类型的原始数组提供重载。

如果您想对 short[] 执行与 int[] 相同的操作,则必须提供重载方法,例如 example(short[] anArray)

JLS, Section 5.1,指定所有类型的转换,并明确禁止那些未在 5.1.12,“禁止转换”中列出的:

> Any conversion that is not explicitly allowed is forbidden.

原始数组类型之间的转换未列出,因此不允许。

【讨论】:

    【解决方案2】:

    在 Java 中,数组是对象,只要一个 short 数组不扩展 int 数组,它就不能作为参数传递。

    换言之,短数组 IS-not-A array of int。

    【讨论】:

      【解决方案3】:

      您可以将 short 与 int 与标量基元混合,这称为加宽,例如您可以这样做:

      short x = 4;
      int y = x;
      

      没有问题。

      仅使用标量类型而不是数组可以根据引用进行扩展。

      原始类型的 22 种特定转换称为窄化 原始转换:

      字节或字符的缩写

      字符转字节或短

      int 转换为字节、short 或 char

      long 为 byte、short、char 或 int

      浮点到字节、short、char、int 或 long

      double 到 byte、short、char、int、long 或 float

      缩小原语转换可能会丢失有关 数值的整体大小,也可能会丢失精度和 范围。

      从 double 到 float 的缩小原始转换由 IEEE 754 舍入规则 (§4.2.4)。此转换可能会丢失 精度,但也失去范围,导致从一个浮点零 非零双精度和来自有限双精度的浮点无穷大。双 NaN 转换为浮点 NaN,双无穷大转换为 同符号浮点无穷大。

      有符号整数到整数类型 T 的窄化转换 简单地丢弃除 n 个最低位之外的所有位,其中 n 是数字 用于表示类型 T 的位。除了可能丢失 有关数值大小的信息,这可能会导致 结果值的符号与输入的符号不同 价值。

      char 到整型 T 的窄化转换同样简单 丢弃除 n 个最低位之外的所有位,其中 n 是 用于表示类型 T 的位。除了可能丢失 有关数值大小的信息,这可能会导致 结果值为负数,即使字符 表示 16 位无符号整数值。

      更多信息:http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-25
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多