Java 如何编写一个接受堆栈和队列的方法?

Java 如何编写一个接受堆栈和队列的方法?,java,generics,methods,stack,queue,Java,Generics,Methods,Stack,Queue,所以我写了一个很大的方法。如果给它一个堆栈,它将返回一个堆栈。如果给它一个队列,它将返回一个队列。它使用大量递归,并接受队列/堆栈并返回相应修改的相同队列/堆栈 我不想复制/粘贴我的方法,这样我就可以更改内部使用的类型,那么有什么方法可以使它成为泛型的吗?在中,它会接受任何旧的收集和发挥它?我尝试只使用Collection,但问题是它没有可用于堆栈/队列的.remove() 任何帮助都将不胜感激 谢谢。将您的方法设置为私有,并创建两个公共方法:一个采用堆栈,另一个采用队列。让这些方法中的每一个都

所以我写了一个很大的方法。如果给它一个堆栈,它将返回一个堆栈。如果给它一个队列,它将返回一个队列。它使用大量递归,并接受队列/堆栈并返回相应修改的相同队列/堆栈

我不想复制/粘贴我的方法,这样我就可以更改内部使用的类型,那么有什么方法可以使它成为泛型的吗?在中,它会接受任何旧的收集和发挥它?我尝试只使用Collection,但问题是它没有可用于堆栈/队列的.remove()

任何帮助都将不胜感激


谢谢。

将您的方法设置为私有,并创建两个公共方法:一个采用堆栈,另一个采用队列。让这些方法中的每一个都强制转换并返回调用私有方法的结果。这样可以避免重复,同时仍然具有特定的方法签名。

队列和堆栈都有一个remove()方法,但方法不同。因此,Java需要知道在编译代码时调用哪些方法。您需要有两种不同的方法。抱歉

您需要编写一个包含堆栈和队列中所需操作的接口,因为您希望对这两种操作都使用递归/操作

这个新的接口将有两个具体的类,它们将依赖于下面的堆栈和队列实例,然后多态性将变成魔术


您可以始终为“GetUnderlineCollection()”提供一个方法,以便在正确的强制转换后获得实际的堆栈或队列,但实现多态操作将使递归算法更通用。

我猜您的意思是
java.util.Stack
java.util.Queue
<代码>队列定义自己的方法
Stack
继承了它的
remove(…)
方法,所以我想你的意思是

我想到了两种方法:

  • 提供两个公共方法重载,它们都使用两个参数调用私有方法,其中一个参数始终为null

  • 使用您需要的常用方法定义一个接口,在两个私有方法中的每一个方法中都有一个匿名的内部类定义(如果它们足够大,则有一个完整的具体类定义)


您应该选择哪一个取决于您需要在内部执行多少丑陋的条件方法调用。无论怎样,OO纯粹主义者都更喜欢接口实现。:-)

您可以使用Collection,但在执行删除操作时需要进行特殊的案例处理。当然,当你得到一个不是两者之一的收藏时,你必须弄清楚该怎么做

if (myCollection instanceof Queue) {
    ((Queue)myCollection).remove();
} else if (myCollection instanceof Stack) {
    ((Stack)myCollection).remove(thingy);
} else {
    // Oops! Now what?
}

您可以在内部实现这一点,但将公共API限制为只允许您传入队列或堆栈。非常感谢goto10和其他所有回答此问题的人。这对我的目的来说是完美的。我只是把它放到一个方法中,并制作了另一个用于插入的方法,它在一般集合上运行良好。一个小细节,它是instanceof,而不是instanceof(即O不大写)。再次感谢。注意Stack的Javadoc声明Deque更可取。如果可能的话,您可能希望完全忽略堆栈。问题是,私有方法目前只接受堆栈,我想知道如何让它也接受队列,并且只对其调用.remove()和.add(),因为队列和堆栈在Java中都有这些方法。基本上,对于我来说,这个大型方法应该接受什么类型的堆栈和队列,以及我需要在这些堆栈和队列上使用什么类型的强制转换?@user999674:这主要取决于你的方法实际做了什么。由于队列和堆栈针对不同的操作进行了优化,因此您可能希望将输入限制为一个或另一个,甚至只需要提供
列表。您还可以将非特定逻辑抽象到另一个方法中,并向其传递某种包装器,该包装器知道如何添加和删除底层项上的项。可能性相当大,而且你还没有提供足够的信息给你一个真正好的答案。我只是回答了最初提出的问题。我感谢您的帮助,这确实是一种很好的方法,但是考虑到删除和添加的方式,它确实需要一个语句,首先询问它是堆栈还是队列,正如goto10所发布的。