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

Standardized Constructors Across Subclasses?

我有一个摘要 class AbstractClass,还有两个 non-abstract class 扩展它:ABAB 都有接受 String 参数的构造函数。我还有一个接受 Class<? extends AbstractClass> 然后创建它的新实例的方法。我怎样才能使 AbstractClass 的所有 children 在它们的构造函数中都有一个 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);

你不能。无法要求构造函数具有任何参数。

但是,您传递的是 Function<? 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);

并且如果您有一个 class 其构造函数不采用单个 String 参数:

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

那么 instantiateClass(C::new) 将无法编译;但是 instantiateClass(unused -> new C()) 会。