Java泛型Builder模式出现Type parameter is not within its bound报错如何解决
Java Builder模式泛型配置错误问题排查
问题背景
学习Builder模式配置泛型逻辑时出现编译错误,以下为精简后的业务代码:
相关代码
顶层抽象类 Question
public abstract class Question{ private StringProperty question = new SimpleStringProperty(); private StringProperty description = new SimpleStringProperty(null); private ObjectProperty<Object> defaultValue = new SimpleObjectProperty<>(null); private BooleanProperty required = new SimpleBooleanProperty(false); private QuestionType questionType; public abstract String getValueEmailString(); public Question(String question) { this.question.set(question); } public Question(String question, String description, Object defaultValue, boolean required) { this.question.set(question); this.description.set(description); this.defaultValue.set(defaultValue); this.required.set(required); } }
实现类 TextQuestion
public class TextQuestion extends Question { private boolean longText = false; public TextQuestion(String question) { super(question); setQuestionType(QuestionType.TEXT); } }
抽象Builder基类
public interface QuestionBuilder<SELF, TTarget extends Question> { SELF text(String questionText); SELF description(String description); SELF defaultValue(Object defaultValue); SELF required(boolean required); TTarget build(); } abstract static class AbstractQuestionBuilder<SELF extends QuestionBuilder<SELF, TTarget>, TTarget extends Question> implements QuestionBuilder<SELF, TTarget> { private String questionText; private String description; private Object defaultValue; private boolean required; private QuestionType questionType; @Override public SELF text(String questionText) { this.questionText = questionText; return self(); } @Override public SELF description(String description) { this.description = description; return self(); } @Override public SELF defaultValue(Object defaultValue) { this.defaultValue = defaultValue; return self(); } @Override public SELF required(boolean required) { this.required = required; return self(); } @Override public TTarget build() { return internalBuild(); } protected abstract TTarget internalBuild(); private SELF self() { return (SELF) this; } }
统一构建入口类(报错位置)
public class QuestionBuilders { // 报错位置 static class TextQuestionBuilder extends AbstractQuestionBuilder<QuestionBuilder, Question> { private boolean longText = false; public TextQuestionBuilder longText(boolean longText) { this.longText = longText; return this; } @Override protected Question internalBuild() { return null; } } }
报错信息
Type parameter 'QuestionBuilder' is not within its bound; should extend 'QuestionBuilder<QuestionBuilder,Question>'
问题原因
AbstractQuestionBuilder的第一个泛型参数SELF设置了递归泛型约束SELF extends QuestionBuilder<SELF, TTarget>,要求传入的实际类型必须是实现了QuestionBuilder且第一个泛型参数指向自身的类型。你直接传入裸类型QuestionBuilder,不满足约束条件,因此编译报错。
同时第二个泛型参数TTarget指定为顶层Question也不符合业务逻辑,TextQuestionBuilder的目标构建对象是具体的TextQuestion类,应该指定为具体实现类型。
解决方案
修改TextQuestionBuilder的泛型参数即可:
static class TextQuestionBuilder extends AbstractQuestionBuilder<TextQuestionBuilder, TextQuestion> { private boolean longText = false; public TextQuestionBuilder longText(boolean longText) { this.longText = longText; return this; } @Override protected TextQuestion internalBuild() { // 补充实际构建逻辑 TextQuestion result = new TextQuestion(questionText); result.setDescription(description); result.setDefaultValue(defaultValue); result.setRequired(required); result.setLongText(longText); return result; } }
额外注意事项
你的代码中存在两处重复定义的AbstractQuestionBuilder,删掉外层冗余的定义即可。
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

