2017-04-20 198 views
1

我有應該接收到一個Class<A>,類似的方法:傳遞Child.class作爲參數

protected void method(final Class<A> clazz) { 
} 

然後,當我試圖像method(A.class)叫它做的工作,但如果我嘗試method(B.class),其中B是子女A,我收到消息「不兼容的類型」。

解決的辦法是改變Class<B>,但我還有一個孩子的,我喜歡作爲參數傳遞給這個method(),像C.class

+3

相關:[是列表列表的子類?爲什麼不是Java的泛型隱含多態?](http://stackoverflow.com/q/2745265) – Pshemo

回答

5

一個解決方案是限定參數時使用有界通配符:

protected void method(final Class<? extends A> clazz) { 
    // Code here... 
} 

由此,你被允許通過直接A的類或從A延伸的任何類。

或者爲帕夫洛·建議:

protected <T extends A> void method(final Class<T> clazz) { 
    // Code here... 
} 

雙方將工作,但將有助於瞭解您打算如何處理clazz這樣做,我們可以選擇一個比其他。

+4

我會建議使用'protected void方法(final Class clazz)''會事件變好,因爲當你嘗試調用'clazz'上的方法時,它可以避免通配符混亂。 –

+0

@PavloViazovskyy你指的是什麼泛型混亂?所有你可以在類「」上調用的是生產者方法; (例如)'A instance = clazz.getInstance();'。 –

+0

@AndyTurner。你是對的。這是我的錯誤。由於'Class'沒有使用消費者方法(以'T'作爲參數),所以使用_Jacob_最初建議的通配符版本就足夠了。 –