有關我所指的示例,請參閱Boolean#TYPE。原始包裝和靜態「TYPE」類對象
所有的包裝類(布爾,雙精度,整數等)都有一個與它們相關的靜態類字段,稱爲TYPE
。這是什麼意思?
具體來說,這裏有一些軟測試:
System.out.println(Boolean.class == Boolean.TYPE);
System.out.println(Boolean.TYPE.isInstance(Boolean.valueOf(true)));
兩個評估爲假。 (而作爲邊注,一個.equals
比較是不必要的,因爲類不覆蓋從Object等。)
兩個Boolean.class
和Boolean.TYPE
是Class<Boolean>
,因爲它們是==
可比沒有發生錯誤。將兩個對象與不同的聲明通用類型進行比較是非法的。
在進一步檢查,TYPE
字段由沿着下面的行調用包專用本地方法Class#getPrimitiveClass
檢索到:
public static final Class<Boolean> TYPE = Class.getPrimitiveClass("boolean");
在方法本身的註釋,沒有特別信息要麼。它表示它返回VM的類對象,因爲它是一個本地方法,所以它非常明顯。
除了Java文檔中對「表示原語類型」的模糊暗示,我無法找到任何關於此的文檔。這個領域有什麼用途嗎?它在包裝類本身中未被使用。
(編輯)
System.out.println(boolean.class == Boolean.TYPE);
是真實的。
還一個用途是再反思:
try {
Constructor ctor = Boolean.class.getConstructor(Boolean.class);
} catch (Exception e) {
System.out.println("NoSuchMethodException gets thrown");
}
try {
Constructor ctor = Boolean.class.getConstructor(Boolean.TYPE);
System.out.println(ctor.newInstance(true));
} catch (Exception e) {
// (no exception thrown)
}
而且我發現,引用一些SO線程,如this one。我想我是從谷歌的「錯誤的結局」中發現的,所以沒有找到任何結果。
但考慮到「原始類」(boolean.class
,int.class
等)的存在,並沒有真正解釋TYPE字段的存在。基本上它是「在那裏」?我仍然不明白。
+1換句話說,'Float.TYPE'指的是實際的原始類,但是'Float.class'返回到擴展Object的包裝類型。 – mellamokb
@mellamokb正確,這就是發生了什麼。 – dasblinkenlight
你知道是否有任何區別,比如'Float.TYPE'和'float.class'?我的意思是*技術*,而不僅僅是*在使用*因爲它們在運行時顯然是相同的對象。 – Radiodef