的類對象包含下列方法:簽名()方法
public final Class<? extends Object> getClass().
爲什麼這種方法的返回類型是用於Class<? extends Object>
的類對象包含下列方法:簽名()方法
public final Class<? extends Object> getClass().
爲什麼這種方法的返回類型是用於Class<? extends Object>
由於Java缺乏self types。 (如果有,則返回類型爲Class<? extends self_type>
)。因此,僅僅簽名聲明Class<?>
,(下一個),最好是可以做的,這是不太理想 - 編譯器肯定知道getClass()
不返回任何類,而是一類是靜態類型的的亞型在其上調用getClass()
的表達式。
因此,我們有這個奇點,該方法的簽名聲明Class<?>
由於語言的限制,但是編譯器將返回值作爲Class<? extends TheClass>
因爲它知道它是安全的,希望對大家有所幫助:)
PS:你看到了Class<? extends Object>
,因爲你在一個靜態類型爲Object
的表達式上調用getClass()
。
就是這樣。你的解釋有助於理解Object#getClass的javadoc! – 2010-07-05 21:33:07
是的,謝謝Dimitris :) 我使用IDEA,當我要求從obj.getClass()創建一個變量時,它會自動創建一個Class <?擴展Obj>。 – 2010-07-05 21:38:49
啊,我剛剛加入PS:使其更清晰:)(順便說一句,你好!) – 2010-07-05 21:39:40
的的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();
嗡嗡聲,它不編譯... – 2010-07-05 21:26:47
實際上,不編譯 – kafka 2010-07-05 21:27:57
它只需使用'myclass instanceof MyClass'。 – 2010-07-05 21:29:25
因爲,通用構造? extends Object
匹配擴展Object的任何Java對象。由於Java中的所有內容都是從Object繼承的,因此它會匹配加載到類路徑上的所有內容。在這種情況下,如果不使用Class<? extends Object>
,Object.getClass()
方法將只能返回對象類,而不像大多數開發人員所期望的那樣返回代表實際具體類型的Class對象。
實際簽名(在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
這實際上是JDK 1.5中的一個錯誤。另見this topic和this 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>
。
我剛剛看過Jdk(1.6 update 20)的實現,並且我看到getClass()方法返回一個類>。 – 2010-07-05 21:31:07