我需要在继承自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);
}
答案 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<>();