超类的Java泛型上下文类型

超类的Java泛型上下文类型,java,Java,项目核心的合规性 失败,出现编译错误 类型JavaSourceBuilderBase.MethodParameterBuilderBase的方法endParameter()未定义 目标线是 .withParameter().withType(..).withName("aInstance").endParameter() withParameter()返回一个有效包含endParameter()但不包含其超类的类 public class ParameterMethodParameterBu

项目核心的合规性 失败,出现编译错误

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

目标线是

.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;
        }
    }
公共类参数MethodParameterBuilder扩展了MethodParameterBuilderBase{
公共参数MethodParameterBuilder(com.sabre.buildergenerator.sourcegenerator.java.MethodParameter ainStation){
超级(aInstance);
}
公共生成器端口endParameter(){
return(GeneratorT)MethodBuilderBase.this;
}
}
现在是超级班

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;
        }
    }
公共静态类方法ParameterBuilderBase{
私有最终com.sabre.buildergenerator.sourcegenerator.java.MethodParameter实例;
受保护的MethodParameterBuilderBase(com.sabre.buildergenerator.sourcegenerator.java.MethodParameter aInstance){
实例=立场;
}
受保护的com.sabre.buildergenerator.sourcegenerator.java.MethodParameter getInstance(){
返回实例;
}
带类型的公共生成器端口(java.lang.String aValue){
setType(aValue);
返回(生成端口)此;
}
具有名称的公共生成器端口(java.lang.String aValue){
setName(aValue);
返回(生成端口)此;
}
}
所以问题是withName()和withType()返回不包含endParameter的超类

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

关于生成端口的上下文

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扩展了JavaSourceBuilderBase{
公共静态JavaSourceBuilder javaSource(){
返回新的JavaSourceBuilder();
}
公共JavaSourceBuilder(){
super(新的com.sabre.buildergenerator.sourcegenerator.java.JavaSource());
}
public com.sabre.buildergenerator.sourcegenerator.java.JavaSource build(){
返回getInstance();
}
}
@抑制警告(“未选中”)
类JavaSourceBuilderBase{
...
}


完整的类源代码:

经过一些操作后,看起来项目还没有完成,但我成功地运行了它,其中有一些更改,如:

p s class MethodParameterBuilderBase<GeneratorT extends MethodParameterBuilderBase> {
...
}
ps类方法参数builderbase{
...
}

ps类方法参数builderbase{
....
}
这将删除编译异常

我还查看了,但得到了相同的结果。库的生成器部分未完成,因为它无法编译。即使您使用@Nassim MOUALEK的答案解决了
JavaSourceBuilder
问题,您稍后也会失败,因为基本的
ReflectionUtil
SignatureUtil
方法抛出
不支持异常。它们没有得到执行

无论如何,这台发电机永远不会工作。这是因为编译时需要生成器,但生成器本身需要编译后的源代码进行内省。如果您考虑的是maven构建阶段,那么这个生成器将位于
生成源代码
阶段,其中源代码尚未编译。但是整个生成器只能在已经编译的类上运行

由于builders是一个eclipse插件,并且在源代码级别上运行,因此这个概念与eclipse配合得很好。这很可能就是发电机未完工的原因


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

ParameterMethodParameterBuilder
的上下文中,什么是
Generator
?您认为这可能是您的问题吗?您似乎正在尝试使用“奇怪的重复模板模式”。。。但是有点不对劲。也就是说,您的子类没有
generator
。。。这是扩展基类时指定的基类的泛型类型参数。返回一个
ParameterMethodParameterBuilder
它不是我的代码,它是一个开源项目,我只是想构建它