首页 > 解决方案 > 跨子类的标准化构造函数?

问题描述

我有一个抽象类AbstractClass和两个扩展它的非抽象类:AB. 两者都A具有B接受参数的构造String函数。我还有一个方法可以接收Class<? extends AbstractClass>然后创建它的新实例。我怎样才能让所有的孩子在他们的构造函数中AbstractClass都有一个?String

代码以防我在解释中不是很清楚:

public abstract class AbstractClass {
    // do stuff
}

public class A extends AbstractClass {
    public A(String str) {
        // do stuff
    }
}

public class B extends AbstractClass {
    public B(String str) {
        // do stuff
    }
}

// this is stuff in other places
public void instantiateClass(Class<? extends AbstractClass> obj) {
    AbstractClass object = obj.newInstance("blah"); // Error: Expected 0 arguments but found 1
    // do stuff
}
instantiateClass(A.class);
instantiateClass(B.class);

标签: javaabstract-class

解决方案


你不能。没有办法要求构造函数有任何参数。

但是,您传递 aFunction<? super String, ? extends AbstractClass>而不是 a Class<? extends AbstractClass>: 这样,您必须提供一个接受单个String参数的东西,即使它不是专门的构造函数:

public void instantiateClass(Function<? super String, ? extends AbstractClass> fn) {
    AbstractClass object = fn.apply("blah");
    // do stuff
}

instantiateClass(A::new);
instantiateClass(B::new);

如果你有一个类的构造函数不接受单个String参数:

public class C extends AbstractClass {
    public C() {
        // do stuff
    }
}

然后instantiateClass(C::new)不会编译;但instantiateClass(unused -> new C())会。


推荐阅读