反转通用列表中的项目

时间:2017-09-29 14:16:34

标签: 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);
}

2 个答案:

答案 0 :(得分:1)

T扩展List无关紧要。重要的是该列表中的对象类型。

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

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

含义:它不应该(也不会)这个方法的内容是List的子类进入。通用部分应该是关于里面列出的东西。

答案 1 :(得分:1)

您无法向绑定extends的集合添加内容(?? extends Object的简写)。对于类型安全性,编译器不允许在这样的集合上调用使用者方法(接受类型变量类型的参数的东西)。这是因为它可能是Stack<Integer>Stack<Foo>,而不仅仅是Stack<T>

这里最简单的方法是将Stack的类型更改为

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

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

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

static void swapList(List<?> list) {

但是如果你想要一个类型变量,请将它声明为表示列表元素类型的变量,这样你就可以将它作为一个绑定在你的Stack上:

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