java - 反转通用列表中的项目

标签 java generics collections

我需要在继承自 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/

相关文章:

java - 如何从流中读取图像?

java - 有没有办法可以制作一个 try-try-catch block ?

c# - 是否可以将 Page DataSource 绑定(bind)到通用列表?

java - Scala 范围与列表在大型集合上的性能

java - try-with-resources 在哪里用 InputStreamReader 包装流?

generics - 将泛型参数与 impl 的另一个泛型参数匹配

generics - Scala list 有哪些限制?

java - HashMap 与 WeakHashMap 一起被垃圾收集?

scala - 折叠 Scala 序列中匹配元素的子序列

java - Eclipse 中的 JFace 和断言 ClassNotFoundException