繁体   English   中英

通用列表中的冲销项目

[英]Reverse items in generic List

我需要在从List继承的泛型类上将这些项目交换回最前面。 要交换的项目可以是任何类型的课程。 我通过将内容压入相同类型的堆栈中并随后弹出它们来完成此操作。

我收到以下错误:堆栈中的推(捕获)无法应用于(捕获)

代码:

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);
}

T扩展List没关系。 重要的是该列表内的对象类型。

因此,最有可能的是,您的方法签名应该看起来像:

static <T> void swapList(List<T> list){

含义:List的子类传入此方法应该(也没有关系)。通用部分应该是关于列表内部的东西。

您不能向具有extends的集合中添加某些内容( ?? extends Object的简写)。 为了确保类型安全,编译器不允许您在此类集合(接受类型变量类型的参数的集合)上调用使用者方法 这是因为它可能是Stack<Integer>Stack<Foo> ,而不仅仅是Stack<T>

在这里最简单的操作是将Stack的类型更改为

Stack<Object> temp = new Stack<>();

您实际上并不关心要添加的内容。 并且您不关心返回反向的List<T>

实际上,您的类型变量是多余的。 您可以简单地将方法声明为:

static void swapList(List<?> list) {

但是,如果确实要使用类型变量,则将其声明为代表列表元素类型的变量,因此也可以将其用作堆栈上的绑定:

static <T> void swapList(List<T> list){
  Stack<T> temp = new Stack<>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM