泛型多继承适配:如何编写兼容Deque或AbstractQueue的方法?
如何编写支持Deque或AbstractQueue类型参数的泛型方法
你原来的写法里用||指定多个类型上界是不对的,Java泛型不支持这种语法。咱们拆解下问题,找到合适的解决方案:
首先明确:Deque是继承自Queue的接口,AbstractQueue是实现了Queue的抽象类,它们的共同父类型是Queue,但两者的实现类(比如ArrayDeque和PriorityQueue)没有共同的子类,所以没法用单一泛型上界直接覆盖这两种类型。这里有两种清晰的解决思路:
方案一:重载方法(最直观的方式)
直接为两种类型分别编写方法,调用时编译器会自动匹配对应的方法,方法引用也能完美适配:
// 处理Deque类型的参数 public <T> void solve(Deque<T> x, Function<Deque<T>, String> fun) { fun.apply(x); } // 处理AbstractQueue(及其子类,比如PriorityQueue)类型的参数 public <T> void solve(AbstractQueue<T> x, Function<AbstractQueue<T>, String> fun) { fun.apply(x); }
这样你原来的调用代码可以完全正常工作:
// 传入ArrayDeque和Deque的方法引用 solve(new ArrayDeque<String>(), Deque::pollFirst); // 传入PriorityQueue和Queue的方法引用(AbstractQueue继承自Queue,所以兼容) solve(new PriorityQueue<String>(), Queue::poll);
方案二:统一为Queue类型(更通用,但灵活性稍弱)
如果想只用一个方法,可以让参数类型统一为Queue(因为两种类型都实现/继承了它),但使用Deque的特有方法(比如pollFirst)时,需要在方法引用里做类型转换,或者用lambda表达式:
public <T extends Queue<?>> void solve(T x, Function<T, String> fun) { fun.apply(x); }
调用示例:
// 用lambda处理Deque的特有方法 solve(new ArrayDeque<String>(), d -> ((Deque<String>) d).pollFirst().toString()); // 直接用Queue的方法引用处理PriorityQueue solve(new PriorityQueue<String>(), Queue::poll);
不过这种方式不如重载直观,因为需要手动处理类型转换,所以更推荐第一种重载方案。
最后再提醒下:Java泛型的多上界语法是用&,比如<T extends AbstractQueue & Deque>,但这种写法在这里没有意义——没有任何类会同时继承AbstractQueue又实现Deque,完全不适用你的场景。
内容的提问来源于stack exchange,提问作者wBacz
相关产品推荐
相关产品推荐

