繁体   English   中英

包装器类作为方法返回类型

[英]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类:-

  1. 它包装一个int。
  2. 具有int类型的两个静态final字段:MIN_VALUE和MAX_VALUE。
  3. MIN_VALUE包含一个int的最小值(-2 ^ 31),MAX_VALUE包含一个int的最大值(2 ^ 31-1)。
  4. 它还具有两个构造函数-public Integer(int值)和public Integer(字符串值)。
  5. Integer具有无参数的byteValue,doubleValue,floatValue,intValue,longValue和shortValue方法,这些方法将包装后的值分别转换为字节,double,float,int,long和short。
  6. 另外,toString方法将值转换为String。
  7. 静态方法将String解析为int(parseInt),然后将int转换为String(toString)。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM