請問Class<SomeObject>
只有一個實例是SomeObject.class
?類<SomeObject>是否只有一個實例?
這是一個功能
void f(Class<SomeObject> arg)
是有可能只傳遞SomeObject.class
否則編譯時錯誤?
請問Class<SomeObject>
只有一個實例是SomeObject.class
?類<SomeObject>是否只有一個實例?
這是一個功能
void f(Class<SomeObject> arg)
是有可能只傳遞SomeObject.class
否則編譯時錯誤?
您可以隨時通過null
,但除此之外,是唯一有效的參數會被加載相同ClassLoader
作爲類SomeObject.class
那包含void f(Class<SomeObject> clazz)
。
您可以有多個不同的SomeObject.class
實例,但它們需要由不同的類加載器加載(否則它們將不是單獨的實例,但都會引用同一個Class對象)。
是的。
正如描述的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)
}
...
}
是
也許你這樣的事情嗎?
類<?延伸SomeObject>
這是一流的SomeObject
符號或覆蓋(與語法高亮顯示一些錯誤,不<之間接受?,空間?不需要)
它確實看起來真每個類只有一個對應的Class
實例,請參閱this discussion
不幸的是,您的方法也可能被原始Class
參數調用:)。
Class clazz = AnotherClass.class;
f(clazz);
謝謝!那麼,定義 void f(Class arg)會是沒有意義的,因爲它只接受SomeObject.class? –
不! SomeObject可以擴展,所以如果你有一個擴展對象,你可以在方法上處理這個。 – Victor
@Alex這可能看起來毫無意義,但在某些特殊情況下它可能很有用。例如,如果您使用'init(Class clazz)'方法創建了類MyClass ',然後您可以從它擴展或類似的東西。 –
kajacx