This question是关于“为什么autoboxing会在Java中使一些调用变得模棱两可?”
但是通过阅读答案,有很多关于演员的内容,我不确定我是否完全理解这些差异。
有人可以提供一个简单的解释吗?
答案 0 :(得分:34)
拳击是指将原始类型转换为引用类型时,反拳击是相反的。转换是指您希望将一种类型视为另一种类型,在基本类型和引用类型之间,这意味着隐式或显式装箱操作。是否需要明确是语言功能。
答案 1 :(得分:24)
转换和装箱/拆箱都与类型和明显(或实际)转换有关,但装箱/拆箱特定于基本类型与其对应的包装类型之间的关系,而转换是显式或隐式更改的术语在一般意义上的类型。
投射是一个通用术语,有两个相关但不同的含义:
处理一种类型的值,就好像它是另一种类型的值。第一个用法的两个例子是:
1.1。鉴于类B
扩展了类A
,您可以通过编写{{1}来要求将myB
B
的实例视为A
的实例。无论何处出现对((A) myB)
实例的引用。这实际上并不会产生A
的新实例。
1.2。 Pre-Java5集合将所有内容存储为A
;这通常要求您在从集合中检索对象后使用强制转换。例如,如果您在Object
中存储了String
并且需要获取其长度,那么您可以编写类似Map
的内容,其中需要强制转换才能调用{ {1}} ((String) myMap.get(someKey)).length()
的方法。同样,这不会导致创建新的length
。
明确转换一种类型(即显式更改表示)。第二种用法的一个例子是在表达式String
中,它通过添加0.5(产生浮点值)然后显式地将该值转换为整数来舍入浮点变量。生成的整数值(在String
强制转换后)通过内部计算从其他值生成
当存在超类/子类或接口/实现者关系(意味着上面的1)或两种类型是原始数字类型(意思是2)时,可以进行转换。您可能会查找“扩大”和“缩小”以获取更多详细信息。
Boxing 是指在容器对象中包装基本类型,通常只在必须有对象时才会进行(例如,在集合中存储值)。原始类型和包装类型成对出现:
((int) (float_var + 0.5F))
取消装箱只是意味着从其对象包装器中检索原始值。
从Java5开始,当您编写一个使用原始值的表达式,其中需要相应的包装类型(例如将整数放入集合中)时,编译器会自动滑入实际包含该原始值的代码中。同样,它将为您提供解包代码。
所以不要写(在Java5之前)像:
(int)
你可以写:
int Integer
long Long
boolean Boolean
... ...
并且编译器会插入装箱/取消装箱代码。
答案 2 :(得分:8)
List<String> list = (List<String>)object;
是演员。
void doSomething(Integer i) { ... }
...
doSomeething(5);
是自动装箱。
Integer getSomething();
...
int i = getSomething();
是自动取消装箱。
答案 3 :(得分:4)
在Java 5中引入了自动装箱以防止代码如下:
map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));
你现在可以说:
map.put("ABC", 5);
虽然它更容易 - 如果你不完全确定你在做什么,它确实有一些陷阱。
答案 4 :(得分:0)
Boxing将一个值包装在容器中,例如Integer对象中的int原始值
投射就是如何看待类型。
前者产生另一种值,后者只是修改了如何处理已存在的值
除了在原始类型之间进行转换外,实际上会修改它们的表示。 (这不会让它更清楚吗?)
答案 5 :(得分:0)
Boxing和unboxing是Java中的一种类型的转换,您可以从基元转换为其包装类或反转,例如, boolean to Boolean(box),或Boolean to boolean(unbox)。
Java中的强制类型转换,例如:
身份转换(第5.1.1节) 字符串到字符串
扩大原始转换(第5.1.2节) byte to int
缩小基元转换(第5.1.3节) int到byte
扩大参考转换(第5.1.5节) 数字整数
缩小参考转换(第5.1.6节) 数字到整数
拳击转换(§5.1.7) int to Integer
拆箱转换(第5.1.8节)。 整数到int
当编译器为您执行装箱/取消装箱转换时,它会发生自动装箱或自动装箱(它没有明确地在源代码中显示为演员表达式),例如:看到你提到的问题。
答案 6 :(得分:0)
在下列情况下是否可以应用自动装箱和取消装箱?
Long one = 10;
long two = 15;
Long three = 20;
if(one == three) //will this be unboxed or do we need to put a explicit
//condition like if(one.intValue() == three.intValue())
System.out.println("Equal");
else
System.out.println("Not Equal");
if(one == two) //will this be unboxed or do we need to put a explicit
//condition like if(one.intValue() == two)
System.out.println("Equal");
else
System.out.println("Not Equal");