Java 泛型的多重继承
我想要一个带有参数Java 泛型的多重继承,java,Java,我想要一个带有参数x的方法,它可以实现Deque或AbstractQueue。怎么写 这是我的尝试:我知道这很糟糕,但你会明白我想要什么: public <T extends Deque || T extends AbstractQueue> void solve(T x, Function<T, String> fun) { fun.apply(x); } 有时我想把PriorityQueue作为x: solve(new PriorityQueue<String
x
的方法,它可以实现Deque
或AbstractQueue
。怎么写
这是我的尝试:我知道这很糟糕,但你会明白我想要什么:
public <T extends Deque || T extends AbstractQueue> void solve(T x, Function<T, String> fun) {
fun.apply(x);
}
有时我想把PriorityQueue
作为x:
solve(new PriorityQueue<String>, Queue::poll);
solve(新的优先级队列,队列::poll);
您可以通过使用类型
来解决所描述的问题,因为ArrayDeque
和PriorityQueue
都实现了java.util.Queue
。这与GhostCat在评论中的建议非常相似
接口Deque
扩展了队列
,因此您可以实际使用
。方法Deque::pollFirst
包含在类型声明
中
这是我建议的实施方式:
public static void main(String[] args) {
ArrayDeque<String> x = new ArrayDeque<>();
x.add("foo");
solve(x, Deque::pollFirst); // first case
PriorityQueue<String> x1 = new PriorityQueue<>();
x1.add("bar");
solve(x1, Queue::poll); // second case
}
public static <T extends Queue> void solve(T x, Function<T, String> fun) {
String res = fun.apply(x);
System.out.println(res);
}
如果使用
new ArrayDeque()
是相等的new PriorityQueue((a,b)->1)
除非我弄错了-Queue是一个接口,AbstractQueue实现了这一点,那么您对该解决方案有何看法。那么为什么T implements Queue
不够好呢?因为Queue
没有我需要的pollFirst()
方法,您打算在solve()
方法中做什么?您可以使用供应商
而不是函数
。您可以使用多态性并拥有两个函数,一个是带有T extends Deque的函数,另一个是带有T extends AbstractQueue的函数,或者使用通用的T extends object在solve方法中,我想使用第一个或第二个参数将其返回到变量并将其从队列中删除。如果我有两种方法,分别是T extends-Deque
和其他T extends-AbstractQueue
,那么我错过了DRY规则。根据OP@Kayaman给出的(缺少)信息,甚至没有必要使用extends-Queue
。但是,您可以使用一个堆栈和Stack::pop
以及其他类,并使用一个返回字符串的方法。通过使用
您将无法使用这些其他类。但到目前为止,还没有一个理由不允许使用这些类。OP无法清楚地解释自己,所以他真正需要什么仍然是个谜。@Kayaman我的理解是,应该限制与返回字符串的队列相关的方法引用。通过使用
,您仅限于这些方法。我的理解基于问题中对Deque::pollFirst
和Queue::poll
的引用。我同意这个问题没有很好的表述,理解这个问题有很多猜测。你的理解是基于一个不太懂英语的人的解释。代码显示无需限制任何内容。如果OP在solve()
中显示代码,而不是集中在方法签名上,我们实际上会得到一些真实的信息。
public static void main(String[] args) {
ArrayDeque<String> x = new ArrayDeque<>();
x.add("foo");
solve(x, Deque::pollFirst); // first case
PriorityQueue<String> x1 = new PriorityQueue<>();
x1.add("bar");
solve(x1, Queue::poll); // second case
}
public static <T extends Queue> void solve(T x, Function<T, String> fun) {
String res = fun.apply(x);
System.out.println(res);
}
foo
bar