通配符类作为构造函数中的变量

时间:2019-01-07 15:47:40

标签: java generics wildcard

我有A类

class A{}

A1类扩展了A类

class A1 extends A{}

现在在B类中,我想将任何扩展A类的类作为变量传递。

class B{
    Class<? extends A> variable;

    public B(Class<? extends A> variable) {
        this.variable = variable;
    }
}

要在上面运行,驱动程序类如下

 class C {
    public static void main(String args[]) {
        B b=new B(new A());// A cannot be converted to Class<? extends A>.
        B b=new B(new A1());// A1 cannot be converted to Class<? extends A>.
            }
}

因为Class<? extends A> variable意味着,任何扩展类A的类都可以在构造函数中传递,而A1扩展A,那么为什么会给出错误?

我想念什么?

3 个答案:

答案 0 :(得分:5)

我怀疑您实际上想做的是设置B,使其可以与A instances 或{{1}的任何子类型一起使用}。为此,您需要使类A本身是通用的:

B

答案 1 :(得分:3)

Class<? extends A> variable意味着variable可以保存对Class类型的对象的引用,而不是对扩展A的对象的引用。

Class是“元类”,其目的是描述另一个类。从Class实例中,您可以获取此类提供的所有字段和所有方法。您可以查看Java reflection教程以了解更多信息。

要使代码正常工作,您可以编写如下代码:

class B<T extends A> {
    private T variable;
    public B(T variable) {
        this.variable = variable;
    }
}

class C {
    public static void main(String args[]) {
        B<A> b = new B<>(new A());
        B<A1> b1 = new B<>(new A1());
    }
}

通过这种方式,您将创建一个通用类B,该类可以接受A的实例或扩展了A的内容

答案 2 :(得分:1)

相反,可行的是:

B b = new B(A.class); // class type expected and not the instance of

B b = new B(A1.class);

为进一步说明,参数Class<? extends A> variable表示<? extends A>是由提供的Class对象建模的类的类型。因此,您需要提供A类或任何扩展A但类型为Class的类。