我需要在继承自 List 的泛型类上将项目从后到前交换。 当然,要交换的元素可以是任何类型。 我想通过将内容推送到相同类型的堆栈上然后弹出它们来做到这一点。
我收到以下错误: Stack中的push(capture)不能应用于(capture)
代码:
static <T extends List<?>> void swapList(T list){
Stack<?> temp = new Stack<>();
//temp = list.forEach(Collectors.toCollection(Stack::new));
for(int i = 0 ; i < list.size() ; i++){
temp.push(list.get(i)); //list.get(i) produces the error
}
temp.forEach(System.out::println);
}
最佳答案
您无法将某些内容添加到具有 extends
的集合中绑定(bind)( ?
是 ? extends Object
的简写)。为了类型安全,编译器不会让您在此类集合(接受类型变量类型的参数)上调用消费者方法。这是因为它可能是 Stack<Integer>
, Stack<Foo>
,而不仅仅是 Stack<T>
.
这里最简单的事情就是更改您的 Stack
的类型为
Stack<Object> temp = new Stack<>();
你实际上并不关心你要添加什么;你只关心你要添加什么。并且您不关心返回相反的 List<T>
.
事实上,你的类型变量是多余的。您可以简单地将方法声明为:
static void swapList(List<?> list) {
但是,如果您确实想要一个类型变量,请将其声明为表示列表元素类型的变量,这样您也可以将它用作堆栈上的绑定(bind):
static <T> void swapList(List<T> list){
Stack<T> temp = new Stack<>();
关于java - 反转通用列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490747/