如何让父类方法返回调用该方法的子类对象类型?
解决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
相关产品推荐
相关产品推荐

