我知道java(c?)可以使用box和unbox类型,并在必要时在原始类型之间进行转换,但为什么它不希望同时执行此操作。
例如,如果我这样做:
ArrayList<Byte> bytes = new ArrayList<>();
bytes.add(8);
Javac会惊慌失措并告诉我Collection.add(Byte)
不适用,但是我使用ArrayList<Integer>
代替它不会有问题。
如果我愿意byte aByte = 8; bytes.add(aByte);
它也可以正常编译。
为什么会这样,有充分的理由吗?
答案 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作为byte
或int
,则无法指定。
因此,数字始终作为整数处理,而不作为字节处理。因此JVM可以将8封装到正确的包装类中。 <{1}}在此示例中为o.getClass()
。
同样的事情是小数,例如。 java.lang.Integer
被定义为双精度,如果您希望2.3
为浮点数,则必须写2.3
。