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

如何让父类方法返回调用该方法的子类对象类型?

解决DNSRecord子类链式调用的类型问题

要实现父类domain方法返回调用对象的实际子类类型,从而支持链式调用子类独有的方法,可以使用自限定泛型(Self-bounded Generics)来改造你的代码。

步骤1:修改抽象类DNSRecord

通过引入泛型参数并限定其为自身子类,让domain方法返回泛型类型,确保返回的是调用对象的实际类型:

public abstract class DNSRecord<T extends DNSRecord<T>> {
    protected String domain;

    public T domain(String domain) {
        this.domain = domain;
        // 基于泛型限定,此处类型转换是安全的
        return (T) this;
    }
}

步骤2:修改子类NSRecord

继承DNSRecord时,指定泛型参数为子类自身NSRecord,这样父类的domain方法就会返回NSRecord类型:

public final class NSRecord extends DNSRecord<NSRecord> {
    private String nameserver = null;

    public NSRecord(String nameserver) {
        this.nameserver = nameserver;
    }

    public NSRecord nameserver(String nameserver) {
        this.nameserver = nameserver;
        return this;
    }
}

验证链式调用

现在你可以正常执行预期的链式调用了:

NSRecord record = new NSRecord("").domain("pasta.org").nameserver("ns1.somedomain.net");

其他子类的适配方式

对于CNAMERecord这类其他子类,只需遵循同样的继承逻辑即可:

public final class CNAMERecord extends DNSRecord<CNAMERecord> {
    private String cname;

    public CNAMERecord(String cname) {
        this.cname = cname;
    }

    public CNAMERecord cname(String cname) {
        this.cname = cname;
        return this;
    }
}

这种方案的核心是利用自限定泛型约束,让父类方法能够返回子类的实际类型,既保留了父类的复用逻辑,又不影响子类链式调用的灵活性。

内容的提问来源于stack exchange,提问作者LakshyaK2011

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 20:52:28