Java通用上下文超类的类型

时间:2014-04-21 20:33:45

标签: java

fluent-builders-generator项目的CORE的补充 编译错误

失败

方法endParameter()未定义类型JavaSourceBuilderBase.MethodParameterBuilderBase

enter image description here

目标行是

.withParameter().withType(..).withName("aInstance").endParameter()

withParameter()返回一个类有效地包含endParameter()而不是他的超类

public class ParameterMethodParameterBuilder extends MethodParameterBuilderBase<ParameterMethodParameterBuilder> {
    public ParameterMethodParameterBuilder(com.sabre.buildergenerator.sourcegenerator.java.MethodParameter aInstance) {
         super(aInstance);
    }

    public GeneratorT endParameter() {
         return (GeneratorT) MethodBuilderBase.this;
    }
}

现在超级

public static class MethodParameterBuilderBase<GeneratorT extends MethodParameterBuilderBase> {
        private final com.sabre.buildergenerator.sourcegenerator.java.MethodParameter instance;

        protected MethodParameterBuilderBase(com.sabre.buildergenerator.sourcegenerator.java.MethodParameter aInstance) {
            instance = aInstance;
        }

        protected com.sabre.buildergenerator.sourcegenerator.java.MethodParameter getInstance() {
            return instance;
        }

        public GeneratorT withType(java.lang.String aValue) {
            instance.setType(aValue);

            return (GeneratorT) this;
        }

        public GeneratorT withName(java.lang.String aValue) {
            instance.setName(aValue);

            return (GeneratorT) this;
        }
    }

所以问题是withName()和withType()返回不包含endParameter的超类。

我认为这与编译器版本或参数有关系。

关于GeneratorT的背景

public class JavaSourceBuilder extends JavaSourceBuilderBase<JavaSourceBuilder> {
    public static JavaSourceBuilder javaSource() {
        return new JavaSourceBuilder();
    }

    public JavaSourceBuilder() {
        super(new com.sabre.buildergenerator.sourcegenerator.java.JavaSource());
    }

    public com.sabre.buildergenerator.sourcegenerator.java.JavaSource build() {
        return getInstance();
    }
}

@SuppressWarnings("unchecked")
class JavaSourceBuilderBase<GeneratorT extends JavaSourceBuilderBase> {
...

}

完整的类源代码:JavaSourceBuilder.java

2 个答案:

答案 0 :(得分:1)

我也查看了fluent-builders-generator,但结果相同。库的生成器部分是未完成的,因为它不会编译。即使您使用@Nassim MOUALEK的答案修复了JavaSourceBuilder问题,您也会失败,因为基本的ReflectionUtilSignatureUtil方法会抛出UnsupportedException。它们没有实现。

无论如何,这台发电机从未工作过。那是因为你需要在编译时使用Builder,但是生成器本身需要编译的内省来进行内省。如果您正在考虑maven构建阶段,则此生成器将位于generate-sources阶段,其中源代码尚未编译。但整个生成器只能在已编译的类上运行。

由于构建器构建器是一个eclipse插件,并且在源代码级别上运行,因此这个概念与eclipse很好地协同工作。这很可能是发电机未完成的原因。

如果您正在寻找实际工作的构建器生成器,请查看pojobuilder。它使用javax.annotation.processing.Processor在编译时生成构建器。

答案 1 :(得分:0)

经过一些操作之后,它看起来项目还没有完成,但我成功地运行了它,有些变化如下:

p s class MethodParameterBuilderBase<GeneratorT extends MethodParameterBuilderBase> {
...
}

p s class MethodParameterBuilderBase<GeneratorT extends ParameterMethodParameterBuilder> {
....
}

这删除了编译异常