2010-07-05 128 views
3

的類對象包含下列方法:簽名()方法

public final Class<? extends Object> getClass(). 

爲什麼這種方法的返回類型是用於Class<? extends Object>

+1

我剛剛看過Jdk(1.6 update 20)的實現,並且我看到getClass()方法返回一個類。 – 2010-07-05 21:31:07

回答

3

由於Java缺乏self types。 (如果有,則返回類型爲Class<? extends self_type>)。因此,僅僅簽名聲明Class<?>,(下一個),最好是可以做的,這是不太理想 - 編譯器肯定知道getClass()不返回任何類,而是一類是靜態類型的的亞型在其上調用getClass()的表達式。

因此,我們有這個奇點,該方法的簽名聲明Class<?>由於語言的限制,但是編譯器將返回值作爲Class<? extends TheClass>因爲它知道它是安全的,希望對大家有所幫助:)

PS:你看到了Class<? extends Object>,因爲你在一個靜態類型爲Object的表達式上調用getClass()

+0

就是這樣。你的解釋有助於理解Object#getClass的javadoc! – 2010-07-05 21:33:07

+0

是的,謝謝Dimitris :) 我使用IDEA,當我要求從obj.getClass()創建一個變量時,它會自動創建一個Class <?擴展Obj>。 – 2010-07-05 21:38:49

+0

啊,我剛剛加入PS:使其更清晰:)(順便說一句,你好!) – 2010-07-05 21:39:40

0

的的getClass()方法(通常)檢查如果一個類是一種特殊類型

MyClass myClass1 = new MyClass(); 
MyClass myClass2 = new MyClass(); 

if (myClass.getClass().equals(myClass2.getClass()) 
{ 
    // do stuff 
} 

的返回類型是Class對象,因爲你可以把它比作其他類對象。它擴展了Object,因爲所有東西都在Java中擴展對象

另一個用途的getClass(的)是使用的getName(),使

myClass1.getClass().getName() 

回報MyClass

它可以幫助你通過反射由字符串名稱實例化類

string className = myClass1.getClass().getName(); 
MyClass newInstance = (MyClass) Class.forName(className).newInstance(); 
+0

嗡嗡聲,它不編譯... – 2010-07-05 21:26:47

+0

實際上,不編譯 – kafka 2010-07-05 21:27:57

+0

它只需使用'myclass instanceof MyClass'。 – 2010-07-05 21:29:25

1

因爲,通用構造? extends Object匹配擴展Object的任何Java對象。由於Java中的所有內容都是從Object繼承的,因此它會匹配加載到類路徑上的所有內容。在這種情況下,如果不使用Class<? extends Object>Object.getClass()方法將只能返回對象類,而不像大多數開發人員所期望的那樣返回代表實際具體類型的Class對象。

1

實際簽名(在1.6至少)是

public final Class<?> getClass() 

據的Javadoc:

實際結果的類型是級,其中| X |是調用getClass的表達式 的靜態類型的擦除 。例如,對於 示例,在此 代碼片段中不需要強制轉換:

Number n = 0;
類<?擴展Number> c = n。的getClass();

如果您沒有參數化返回值,即使您在運行時有可用的類型信息,也必須進行強制轉換。所以上面的例子最終會成爲

Class c = n.getClass(); //c now has no type information 
2

這實際上是JDK 1.5中的一個錯誤。另見this topicthis bugreport。在一個螺母,這個簽名是引起下面的代碼片段沒有編譯同時應該

List<String> l1 = new ArrayList<String>(); 
List<Integer> l2 = new ArrayList<Integer>(); 
System.out.println(l1.getClass() == l2.getClass()); // Incompatible types? 

他們固定在1.6通過改變返回類型Class<?>,而不是Class<? extends Object>