[英]signature of Object.getClass() method
Object類包含以下方法:
public final Class<? extends Object> getClass().
為什么這個方法的返回類型是Class<? extends Object>
Class<? extends Object>
因為Java缺乏自我類型 。 (如果有它們,則返回類型為Class<? extends self_type>
)。 所以簽名只是聲明了Class<?>
,它可以做的(下一個)最好的,這不太理想 - 編譯器當然知道getClass()
不返回任何類,而是一個類是靜態的子類調用getClass()
的表達式的類型。
因此我們有這個奇點,由於語言的限制,方法的簽名聲明了Class<?>
,但編譯器將返回值視為Class<? extends TheClass>
Class<? extends TheClass>
因為它知道它是安全的,並希望有所幫助:)
PS:你看過Class<? extends Object>
Class<? extends Object>
因為您在靜態類型為Object
的表達式上調用了getClass()
。
這實際上是JDK 1.5中的一個錯誤。 另請參閱此主題和此bug報告 。 在一個堅果中,這個簽名導致以下代碼片段無法編譯,而它應該 :
List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
System.out.println(l1.getClass() == l2.getClass()); // Incompatible types?
他們通過將返回類型更改為Class<?>
而不是Class<? extends Object>
Class<? extends Object>
。
因為,通用構造? extends Object
? extends Object
匹配任何? extends Object
Java對象。 由於Java中的所有內容都繼承自Object,因此它會匹配類路徑中加載的所有內容。 在這種情況下,不使用Class<? extends Object>
Class<? extends Object>
Object.getClass()
方法只能返回Object類,而不能像大多數開發人員所期望的那樣返回表示實際具體類型的Class對象。
實際簽名(至少在1.6中)是
public final Class<?> getClass()
根據javadocs:
實際結果類型是Class,其中| X | 是調用getClass的表達式的靜態類型的擦除。 例如,此代碼片段中不需要強制轉換:
數n = 0;
班級<? extends Number> c = n.getClass();
如果您沒有參數化返回值,即使您在運行時可以獲得類型信息,也必須進行強制轉換。 所以上面的例子最終會成為
Class c = n.getClass(); //c now has no type information
getClass()方法(通常)用於檢查類是否屬於特定類型
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
if (myClass.getClass().equals(myClass2.getClass())
{
// do stuff
}
返回類型是Class對象,因為您可以將它與其他Class對象進行比較。 它擴展了Object,因為一切都在Java中擴展了對象。
getClass()的另一個用途就是使用getName()
myClass1.getClass().getName()
返回MyClass
它可以幫助您通過反射按字符串名稱實現類
string className = myClass1.getClass().getName();
MyClass newInstance = (MyClass) Class.forName(className).newInstance();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.