簡體   English   中英

Object.getClass()方法的簽名

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM