[英]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
問題,您也將在以后失敗,因為基本的ReflectionUtil
和SignatureUtil
方法會拋出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.