跨子类的标准化构造函数?

fin*_*444 1 java abstract-class

我有一个抽象类AbstractClass和两个扩展它的非抽象类:AB. 双方AB有参加一个构造函数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);
Run Code Online (Sandbox Code Playgroud)

And*_*ner 6

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

但是,您传递 aFunction<? super String, ? extends AbstractClass>而不是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);
Run Code Online (Sandbox Code Playgroud)

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

public class C extends AbstractClass {
    public C() {
        // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这种方法还有助于减少反射样板的数量,因为您可以只说“A::new”而无需检查异常。 (2认同)