Java如何使用额外类型参数扩展参数化接口?
扩展带Consumer方法的参数化接口,添加额外类型参数
先把原接口的典型写法列出来,方便咱们对照着改:
// 原参数化接口 public interface OriginalInterface<T> { // 满足条件时调用consumer,否则返回this支持链式调用 OriginalInterface<T> when(boolean condition, Consumer<OriginalInterface<T>> consumer); }
要添加额外类型参数,核心是保住泛型一致性和链式调用的类型安全,具体可以这么操作:
1. 扩展接口的泛型参数列表
把接口的泛型从<T>改成<T, U>,这里的U就是你要加的额外类型参数,如果需要约束类型,还可以加边界,比如U extends SomeBaseType。
2. 同步更新方法的类型签名
方法的返回类型和Consumer的参数类型都要换成扩展后的泛型接口,这样链式调用时才不会丢失新类型的信息:
// 扩展后的参数化接口 public interface ExtendedInterface<T, U> { // 返回类型和Consumer参数都同步更新为ExtendedInterface<T, U> ExtendedInterface<T, U> when(boolean condition, Consumer<ExtendedInterface<T, U>> consumer); }
3. 实现类示例(参考)
如果要写实现类,也能完美适配这个扩展后的接口:
public class ExtendedImpl<T, U> implements ExtendedInterface<T, U> { private T tValue; private U uValue; public ExtendedImpl(T tValue, U uValue) { this.tValue = tValue; this.uValue = uValue; } @Override public ExtendedInterface<T, U> when(boolean condition, Consumer<ExtendedInterface<T, U>> consumer) { if (condition) { consumer.accept(this); } return this; } // 新增类型参数对应的getter/setter public T gettValue() { return tValue; } public U getuValue() { return uValue; } }
4. 链式调用使用示例
扩展后链式调用依然丝滑,还能用上新的类型参数:
new ExtendedImpl<String, Integer>("Hello", 2024) .when(true, inst -> System.out.println("T类型值:" + inst.gettValue())) .when(false, inst -> System.out.println("U类型值:" + inst.getuValue())) .when(true, inst -> System.out.println("组合值:" + inst.gettValue() + "-" + inst.getuValue()));
关键提醒
一定要保证方法返回的是当前泛型化的接口实例,不能退回到原始接口类型,不然链式调用时新添加的类型参数信息就丢了,没法正常用U类型的相关功能。
内容的提问来源于stack exchange,提问作者EvenLisle
相关产品推荐
相关产品推荐

