2015-09-11 27 views

回答

3

您可以隨時通過null,但除此之外,是唯一有效的參數會被加載相同ClassLoader作爲類SomeObject.class那包含void f(Class<SomeObject> clazz)

您可以有多個不同的SomeObject.class實例,但它們需要由不同的類加載器加載(否則它們將不是單獨的實例,但都會引用同一個Class對象)。

8

是的。

正如描述的documentation

返回運行此對象的類。返回的Class對象是 對象,該對象被 表示的類的靜態同步方法鎖定。

但是對於void f(Class<SomeObject> arg)方法,您可以傳遞void f(Class<? extends SomeObject> arg)。看看this question

傳遞一個Class<? extends SomeObject arg你可以做這樣的事情:

myMethod(Class<? extends BasicObject> clazz) 
{ 
    if (!clazz.isInstance(CodeObject)) 
    { 
     (do something different) 
    } 
    ... 
} 
+0

謝謝!那麼,定義 void f(Class arg)會是沒有意義的,因爲它只接受SomeObject.class? –

+0

不! SomeObject可以擴展,所以如果你有一個擴展對象,你可以在方法上處理這個。 – Victor

+1

@Alex這可能看起來毫無意義,但在某些特殊情況下它可能很有用。例如,如果您使用'init(Class clazz)'方法創建了類MyClass ',然後您可以從它擴展或類似的東西。 – kajacx

0
  1. 也許你這樣的事情嗎?

    類<?延伸SomeObject>

這是一流的SomeObject符號或覆蓋(與語法高亮顯示一些錯誤,不<之間接受?,空間?不需要)

0

它確實看起來真每個類只有一個對應的Class實例,請參閱this discussion

不幸的是,您的方法也可能被原始Class參數調用:)。

Class clazz = AnotherClass.class; 

f(clazz); 
相關問題