[英]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.