Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型的多重继承_Java - Fatal编程技术网

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