有人可以解释一下如何/为什么在Java中允许这样做?
public class Test {
private int text;
public Integer getText() {
return text;
}
我基本上将包装类作为返回类型,而我实际上返回了一个原语。
答案 0 :(得分:4)
因为Java在版本5及更高版本中支持Autoboxing and Unboxing。这是前者的一个例子,但后者同样重要(和反向转换)。根据链接,
Autoboxing 是Java编译器在基元类型及其相应的对象包装类之间进行的自动转换。
答案 1 :(得分:2)
请考虑以下代码:(来自:http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
li.add(i);
虽然将int值作为基本类型而不是Integer对象添加到li
,但代码会编译。因为li
是Integer对象的列表,而不是int值列表,所以您可能想知道为什么Java编译器不会发出编译时错误。编译器不会生成错误,因为它从i创建一个Integer对象并将对象添加到li
。因此,编译器在运行时将以前的代码转换为以下代码:
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
li.add(Integer.valueOf(i));
将原始值(例如int)转换为相应包装类(Integer)的对象称为autoboxing。当原始值为:
时,Java编译器应用自动装箱答案 2 :(得分:1)
来自javadocs:因为java 5 Autoboxing是Java编译器在基元类型和它们对应的对象包装类之间进行的自动转换。例如,将int转换为Integer,将double转换为Double,依此类推。
java编译器通常在 -
时应用自动装箱作为参数传递给期望对象的方法 相应的包装类。
分配给相应包装类的变量。
答案 3 :(得分:0)
为了提高性能,并非Java中的所有内容都是对象。还有基元,例如int,long,float,double等。
例如 java.lang.Integer类: -
class AutoBox {
public static void main(String args[]) {
// autobox an int
Integer a = 100;
// auto-unbox
int b = a;
System.out.println(b + " " + a); // displays 100 100
}
}
答案 4 :(得分:-2)
Java 5中添加了此功能。
text 会被编译器自动转换为Integer。所以基本上它的语法糖可以缩短你的代码(否则你会自己来回转换)。当然它有它的价格,如果这发生了很多(我的意思是真的很多,大循环,频繁的调用等等),它可能会成为一个性能问题,所以在使用它时,只要记住它发生在引擎盖下,你没事。
Integer.valueOf(text)
在引擎盖下召唤
该功能称为autoboxing btw
希望这有帮助