[英]Wrapper class as method return type
有人可以解释一下Java为什么/为什么允许这样做吗?
public class Test {
private int text;
public Integer getText() {
return text;
}
实际上,我实际上是将包装器类作为返回类型,而实际上却在返回一个基元。
因为Java在版本5及更高版本中支持自动装箱和取消装箱 。 那是前者的一个例子,但后者同样重要(和反向转换)。 根据链接,
自动装箱是Java编译器在原始类型及其对应的对象包装器类之间进行的自动转换。
考虑以下代码:(来自: 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)的对象的过程称为自动装箱。 当原始值是:Java编译器将应用自动装箱:
来自javadocs :由于Java 5 Autoboxing是Java编译器在原始类型及其对应的对象包装器类之间进行的自动转换。 例如,将int转换为Integer,将double转换为Double,依此类推。
Java编译器通常在以下情况下应用自动装箱-
作为参数传递给需要相应包装类对象的方法。
分配给相应包装器类的变量。
为了提高性能,并不是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 } }
Java 5中已添加此功能。
文本会由编译器自动转换为Integer。 因此,从根本上讲,它是一种语法糖,可以缩短您的代码(否则,您将自己进行来回转换)。 当然,它有其价格,如果这种情况发生很多(我的意思是很多事情,大循环,频繁的调用等),它可能会成为性能问题,因此在使用它时,请记住它是在引擎盖下发生的,并且你会没事的。
Integer.valueOf(text)
被称为幕后
该功能称为自动装箱
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.