簡體   English   中英

超類的Java通用上下文類型

[英]Java Generic Context Type of super Class

fluent-builders-generator項目的CORE編譯失敗,並出現編譯錯誤

對於類型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;
        }
    }

因此,問題在於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

我也看過了fluent-builders-generator,但得出了相同的結果。 庫的生成器部分尚未完成,因為它不會編譯。 即使使用@Nassim MOUALEK的答案解決了JavaSourceBuilder問題,您也將在以后失敗,因為基本的ReflectionUtilSignatureUtil方法會拋出UnsupportedException 它們沒有實現。

無論如何,此生成器將永遠無法工作。 那是因為您需要在編譯時使用Builder,但是生成器本身需要用於自省的編譯源。 如果您正在考慮maven構建階段,則此生成器將位於generate-sources階段,在該階段中尚未編譯源代碼。 但是整個生成器只能在已編譯的類上運行。

由於builders builder是eclipse插件,並且在源代碼級別上運行,因此該概念與eclipse很好地配合使用。 這很可能是發電機未完成的原因。

如果您正在尋找一個實際可用的生成器生成器,請查看pojobuilder 它使用javax.annotation.processing.Processor在編譯時生成生成器。

經過一些操作后,看起來該項目尚未完成,但是我成功運行了它,但進行了如下更改:

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

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

這刪除了編譯異常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM