Java中是否有任何方法可以强制子类或接口实现以具有具有给定签名的构造函数?
假设我有一个:
public interface MyInterface {
// any methods
}
或
public abstract class MyBaseClass {
// any abstract methods
}
现在,有什么可以做的吗
public class MySubClass extends MyBaseClass {
public MySubClass(String s) { }
}
或
public class MySubClass implements MyInterface {
public MySubClass(String s) { }
}
总有一个构造函数将String作为唯一的输入参数?
一个明显的解决方法是使用一个接受String的方法创建工厂接口,并在需要时将其注入。这不是我想要的。
答案 0 :(得分:2)
并非如此,我认为您可以获得的最接近的东西是:
abstract class B {
public B(String s) {
}
}
public class A extends B {
public A(String s) {
super(s);
}
}
这迫使A实现一个非默认构造函数,该构造函数必须调用super(String)
,但不能阻止以下操作:
public class A extends B {
public A() {
super("");
}
}
答案 1 :(得分:2)
很多时候,我希望这样的事情存在,但不幸的是,事实并非如此。甚至像David Soroko所建议的那样也不起作用,因为仍然不会强迫子类具有String构造函数-它可以将喜欢的任何String传递给super
。简而言之,Java语法本身没有这种东西。
我想最接近的一种功能是,如果有人构建了一个注释处理器,该处理器使您可以使用@MustHaveUnaryConstructor(String.class)
之类的注释,然后如果任何子类没有这样的构造函数,则会导致编译失败,并告诉您哪个子类违反了合同。但是我还没有发现这种东西,而且我对注释处理的知识还不足以自己构建。 TL; DR,不,你不能。