跨子类的标准化构造函数?
Standardized Constructors Across Subclasses?
我有一个摘要 class AbstractClass
,还有两个 non-abstract class 扩展它:A
和 B
。 A
和 B
都有接受 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())
会。
我有一个摘要 class AbstractClass
,还有两个 non-abstract class 扩展它:A
和 B
。 A
和 B
都有接受 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())
会。