2015-05-14 61 views
2

我有幾個從公共基類派生的類。創建具有公共基類的Java元類的列表

public class BaseClass ... 

public class ClassA extends BaseClass ... 

public class ClassB extends BaseClass ... 

我需要這些類存儲列表,我可以通過它們的索引進行檢索,並在運行時創建特定的情況下,我可以做到這一點與下面的工作代碼:

List<Class> a = new ArrayList<Class>(); 
    a.add(ClassA.class); 
    a.add(ClassB.class); 

    Class c = a.get(0); 
    BaseClass m = (BaseClass) c.getConstructor().newInstance(); 

我想知道是否有任何方法可以說明該列表中的任何班級必須是BaseClass的後裔。我想確保只有BaseClass的後代可以添加到列表中。像以下:

List<Class<BaseClass>> a = new ArrayList<Class<BaseClass>>(); 
    a.add(ClassA.class); 
    a.add(ClassB.class); 

但是上述代碼拋出編譯器錯誤:只將完全BaseClass.class可以被用作集合的元素

Error:(135, 10) error: no suitable method found for add(Class<ClassA>) 
method List.add(Class<BaseClass>) is not applicable 
(actual argument Class<ClassA> cannot be converted to Class<BaseClass> by method invocation conversion) 
method List.add(int,Class<BaseClass>) is not applicable 
(actual and formal argument lists differ in length) 
method Collection.add(Class<BaseClass>) is not applicable 
(actual argument Class<ClassA> cannot be converted to Class<BaseClass> by method invocation conversion) 
+2

我不確定我是否得到你;你只是指這個'List >'? –

+1

@ᴳᵁᴵᴰᴼ是的,這是答案,如果你將它添加爲答案我會接受它。 –

回答

3

使用通配符上界由你的基類:

List<Class<? extends BaseClass>> a = new ArrayList<Class<? extends BaseClass>>(); 

如果你聲明它就像在你的代碼:

List<Class<BaseClass>> a = new ArrayList<Class<BaseClass>>(); 

它不會工作,因爲Class<ClassA>不是一個亞型Class<BaseClass>,即使ClassA延伸BaseClass

在這裏演示:http://ideone.com/SJGEIz

5

List<Class<BaseClass>>裝置。根據定義,你的問題是,你要插入的子類:

List<Class<? extends BaseClass>> a = new ArrayList<Class<? extends BaseClass>>(); 

將確保子類,允許但沒有其他類。

+0

爲了完全精確,它只_確實將類作爲集合的一個元素。名單會高興地接受ClassA。 –

+0

謝謝,編輯答案。 –

+1

謝謝,作爲承諾,我已接受其他答案,但你得到+1 –

相關問題