Java不会同时包装和转换基元类型

时间:2016-04-17 13:32:48

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

我知道java(c?)可以使用box和unbox类型,并在必要时在原始类型之间进行转换,但为什么它不希望同时执行此操作。

例如,如果我这样做:

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

Javac会惊慌失措并告诉我Collection.add(Byte)不适用,但是我使用ArrayList<Integer>代替它不会有问题。 如果我愿意byte aByte = 8; bytes.add(aByte);它也可以正常编译。

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

1 个答案:

答案 0 :(得分:4)

之所以发生这种情况,是因为如果你执行bytes.add(8),则将8作为int处理。因此抛出以下错误:

  

方法add(Byte)在类型ArrayList&lt;字节&GT;不是   适用于参数(int)

如果要直接向ArrayList添加8,则必须将8转换为字节

bytes.add((byte)8);

在必要时无法将{8}作为byte处理,在其他情况下则无法作为int处理。

想想以下示例:

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

现在,如果您希望将8作为byteint,则无法指定。 因此,数字始终作为整数处理,而不作为字节处理。因此JVM可以将8封装到正确的包装类中。 <{1}}在此示例中为o.getClass()

同样的事情是小数,例如。 java.lang.Integer被定义为双精度,如果您希望2.3为浮点数,则必须写2.3