类和继承的集合

时间:2014-07-31 14:34:48

标签: java generics covariance

我想拥有一个特定子类的Class'es集合来实现这样的目标:

public class Test {
    private class Parent {}
    private class Child1 extends Parent{}
    private class Child2 extends Parent{}

    List<Class<Parent>> classes = new ArrayList();

    public Test() {
        classes.add(Child1.class); 
    }

    public static void main(String[] args) {
        new Test();

    }
}

如何在不破坏编译器的情况下实现上述目标?

2 个答案:

答案 0 :(得分:10)

使用

List<Class<? extends Parent>> classes = new ArrayList<>();

这个

List<Class<Parent>> classes = new ArrayList();

&#34;冷门&#34;编译器,因为它要求列表的元素是Class<Parent>类型。但Child1.class的类型为Class<Child1>。请注意,Class<Child1> 扩展Class<Parent>

答案 1 :(得分:4)

将列表定义更改为List<Class<? extends Parent>>,编译器应该感到高兴。这将定义列表以包含任何扩展Parent的类,即Parent和子类。

请注意List<? extends Class<Parent>>无效,因为您无法扩展Class,即使您的列表可能实际上是ArrayList<Class<Child1>>,因此编译器也不会让您将元素添加到列表中。