Java:What';自动装箱和铸造有什么区别?
是关于“为什么自动装箱在Java中使一些调用不明确?” 但是通过阅读答案,有很多关于演员的参考资料,我不确定我是否完全理解其中的区别 有人能提供一个简单的解释吗Java:What';自动装箱和铸造有什么区别?,java,casting,autoboxing,Java,Casting,Autoboxing,是关于“为什么自动装箱在Java中使一些调用不明确?” 但是通过阅读答案,有很多关于演员的参考资料,我不确定我是否完全理解其中的区别 有人能提供一个简单的解释吗 List<String> list = (List<String>)object; 是自动装箱 Integer getSomething(); ... int i = getSomething(); 是自动取消装箱。Java 5中引入了自动装箱,以防止出现以下代码: map.put("ABC", new In
List<String> list = (List<String>)object;
是自动装箱
Integer getSomething();
...
int i = getSomething();
是自动取消装箱。Java 5中引入了自动装箱,以防止出现以下代码:
map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));
你现在可以说:
map.put("ABC", 5);
虽然它更容易,但如果您不完全确定自己在做什么,它确实会有一些陷阱。装箱是指将基元类型转换为引用类型,而取消装箱则相反。强制转换是指在基元类型和引用类型之间,希望将一个类型视为另一个类型,这意味着隐式或显式装箱操作。它是否需要明确是一种语言特性 装箱是将值包装在容器中,例如整数对象中的int基元值 铸造只是如何看待类型 前者产生另一种价值,后者只是修改如何对待已经存在的价值
除了在基元类型之间进行强制转换之外,实际上会修改它们的表示形式。(这并没有让它更清楚,是吗?装箱和取消装箱是Java中的一种类型转换,您可以从一个原语转换到它的包装类或其逆类,例如布尔到布尔(box),或布尔到布尔(unbox) Java中的强制转换类型,例如:
- 身份转换(§5.1.1) 串对串
- 扩大原语转换(§5.1.2) 字节到整数
- 缩小原语转换(§5.1.3) 整数到字节
- 拓宽参考转换(§5.1.5) 整数对数字
- 缩小参考转换(§5.1.6) 从数字到整数
- 装箱转换(§5.1.7) 整数到整数
- 拆箱转换(§5.1.8)。 整数到整数
自动装箱或自动取消装箱发生在编译器为您执行装箱/取消装箱转换时(它在源代码中没有明确显示为强制转换表达式),例如,请参见您提到的问题。强制转换和装箱/取消装箱都与类型和明显(或真实)转换有关,但是装箱/取消装箱特定于基本类型与其对应的包装器类型之间的关系,而casting是更一般意义上的显式或隐式类型更改的术语 铸造是一个通用术语,有两个相关但不同的含义:
B
扩展了类A
,您可以通过编写((A)myB)
来请求myB
将B
的实例视为A
的实例。这实际上不会生成a
的新实例
1.2。Java5之前的集合将所有内容存储为对象
;这通常要求您在从集合检索对象后使用强制转换。例如,如果您在映射中存储了字符串
,并且需要获取其长度,那么您可以编写类似((String)myMap.get(someKey)).length()的内容,其中需要强制转换才能调用字符串的length
方法。同样,这不会导致创建新的字符串
((int)(float_var+0.5F))
,它通过添加0.5(产生浮点值)来舍入浮点变量,然后将该值显式转换为整数。结果整数值(在(int)
转换后)通过内部计算从另一个值生成int Integer
long Long
boolean Boolean
... ...
取消装箱仅仅意味着从其对象包装器中检索原语值
从Java5开始,当您编写一个表达式,使用需要相应包装类型的基元值时(例如将整数放入集合),编译器会自动插入实际包装该基元值的代码。同样,它将为您提供展开代码
因此,不要(在Java5之前)编写以下内容:
Map myMap = new HashMap();
...
myMap.put(someKey,Integer.valueOf(3));
...
int nextValue = (myMap.get(someKey)).intValue() + 1;
你可以写:
Map<KeyType,Integer> myMap = new HashMap<KeyType,Integer>();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;
Map myMap=newhashmap();
...
myMap.put(someKey,3);
...
int nextValue=myMap.get(someKey)+1;
并且装箱/取消装箱代码由编译器插入。自动装箱和取消装箱是否可以应用于以下情况
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");
这里的关键是Integer是一种引用类型,int(或数字5)是一种值类型/原语。如果拼写正确,则第二个示例是自动装箱。。。。。看起来很有用我相信这是正确的答案,但我不认为装箱/拆箱应该被描述为“转换”。更清楚的说法是,原语被包装在一个等价的对象中。@Unlaw Programmer:我同意,这会更精确。有例子吗@Faizan装箱(顾名思义)指的是使用包装器,即
Integer
而不是int
。下面的答案实际上提供了
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");