在编译时强制存在无参数构造函数(Java)

在编译时强制存在无参数构造函数(Java),java,Java,我有一节课是这样的: public class Test { private final List<ISomeType> things = new LinkedList<ISomeType>(); public <T extends ISomeType> Test(Class<T> clazz, int order) { for (int i = 0; i < order; i++) {

我有一节课是这样的:

public class Test {

    private final List<ISomeType> things = new LinkedList<ISomeType>();

    public <T extends ISomeType> Test(Class<T> clazz, int order) {
        for (int i = 0; i < order; i++) {
            try {
                this.things.add(clazz.newInstance());
            } catch (Exception e) { 
                // stackoverflowers use your imagination
            }
        }
    }
}
公共类测试{
private final List things=new LinkedList();
公共测试(课堂等级,整数顺序){
for(int i=0;i

我期望并希望clazz类有一个可访问的无参数构造函数。有什么方法可以在编译时强制它的存在吗?

反射是在运行时而不是编译时执行操作。如果希望代码正常工作,请不要使用反射。

在编译时无法强制执行构造函数要求。在运行时,您可以检查class.getConstructors()并确保其中有一个没有参数(或者像在示例代码中一样捕获异常)


通常,无参数构造函数需求只是列在基类或接口的Javadoc中

最好的办法是为您关心的每个类创建一个单元测试来检查这个问题,然后在构建时运行单元测试。或者,您可以创建一个测试类(不随代码分发),它只执行您关心的类的无参数构造函数。这不是一个很好的选择。

有一些用于代码样式验证的工具可以扩展以检查这种类型的需求。对于eclipse(和其他),可能会对您有所帮助。通过阅读教程,我认为您应该能够编写一个特定的规则来检查没有任何参数的构造函数

这个怎么样

interface Provider<T> {
   T get();
}

public class Test {

    private final List<ISomeType> things = new LinkedList<ISomeType>();

    public <T extends ISomeType> Test(Provider<T> provider, int order) {
        for (int i = 0; i < order; i++) {
            try {
                this.things.add(provider.get());
            } catch (Exception e) { 
                // stackoverflowers use your imagination
            }
        }
    }
}
接口提供程序{
T get();
}
公开课考试{
private final List things=new LinkedList();
公共测试(提供程序,int顺序){
for(int i=0;i
下面的链接显示了如何使用Java 6和注释处理工具解决类似情况(检查特定类的子类是否都没有参数构造函数):


也许你可以调整他们的解决方案来解决你的问题。

正确的术语是无参数构造函数。不知道为什么,但该方法看起来不像Java-ish。很好的链接。这很可能就是答案。-1只要您真正理解自己在做什么,您的代码也可以工作,并且可以进行反射。但您是对的,不应该在没有需要的情况下使用反射,因为这样会失去编译时的安全性。