You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:24:02