【问题标题】:Java doesn't box and convert primitive types at the same timeJava 不会同时装箱和转换原始类型
【发布时间】:2016-08-09 04:51:36
【问题描述】:

我知道 java(c?) 可以在必要时对类型进行装箱和拆箱以及在原始类型之间进行转换,但为什么它不想同时这样做。

例如,如果我要这样做:

ArrayList<Byte> bytes = new ArrayList<>();
bytes.add(8);

Javac 会惊慌并告诉我Collection.add(Byte) 不适用,但如果我使用ArrayList&lt;Integer&gt; 代替它不会有问题。 如果我会这样做byte aByte = 8; bytes.add(aByte);,它也会编译得很好。

为什么会这样,有什么好的理由吗?

【问题讨论】:

  • 那是因为,您要将文字 int 转换为 byte,int = 4 个字节,而 byte 是一个字节,所以您正在下降,这里 Java 不会决定您的位置,因为您需要显式转换,因为如果您想增加(以字节为单位),可能会丢失一些数据,例如:从 int 到 double,Java 将为您执行 IMPLECIT CAST :)

标签: java javac primitive-types autoboxing syntactic-sugar


【解决方案1】:

之所以会发生这种情况是因为如果你做bytes.add(8),8 被当作一个int 处理。所以抛出以下错误:

ArrayList 类型中的方法 add(Byte) 不是 适用于参数(int)

如果要将 8 直接添加到 ArrayList 中,则必须将 8 转换为一个字节

bytes.add((byte)8);

不能在必要时将 8 处理为 byte,在其他情况下处理为 int

想想下面的例子:

private static void test() {
  Object o = 8;
}

现在,如果您想要 8 作为byteint,则不会指定。 所以数字总是作为整数处理,而不是字节。因此 JVM 可以将 8 包装到正确的包装类中。在本例中,o.getClass()java.lang.Integer

小数也是如此,例如2.3 被定义为双精度,如果你想将 2.3 作为浮点数,你必须写 2.3f

【讨论】:

  • 曼迪米你更快。只是想写那个。 :P 接受我的投票
  • 是的,这正是我所说的,我问的是为什么java不将8作为一个字节处理?
  • 我更新了我的答案,我希望这会让你更清楚为什么数字必须始终作为同一类型处理@S.Klumpers
  • 谢谢@Vancold.at
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2012-10-27
  • 2022-11-27
  • 2015-09-02
相关资源
最近更新 更多