包装类作为方法返回类型

时间:2014-07-09 04:28:03

标签: java

有人可以解释一下如何/为什么在Java中允许这样做?

public class Test {
private int text;

public Integer getText() {
    return text;
}

我基本上将包装类作为返回类型,而我实际上返回了一个原语。

5 个答案:

答案 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类: -

  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 value)&amp; public Integer(String value)。
  5. Integer具有no-arg byteValue,doubleValue,floatValue,intValue,longValue和shortValue方法,它们将包装的值分别转换为byte,double,float,int,long和short。
  6. 此外,toString方法将值转换为String。
  7. 静态方法将String解析为int(parseInt)并将int转换为String(toString)。
  8. 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

希望这有帮助