最后两个陈述有什么区别?为什么一个陈述有效,另一个陈述不起作用?
package Main;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void printIt(List<Object> l)
{
System.out.println(l);
}
public static void main(String[] args) {
List<String> l =new ArrayList<>();
l.add("A");
//what is the differance between the following statments ?
printIt(Arrays.asList("A")); // it compiles successfully
printIt(l); // it does not compile
}
}
答案 0 :(得分:4)
问题是printIt()
方法期望List<Object>
作为参数,但我们将List<String>
传递给它,这就是编译问题的原因。
替换方法printIt()中的参数List,如下所示:
public static void printIt(List<? extends Object> l)
{
System.out.println(l);
}
现在两人都会编译,
答案 1 :(得分:3)
这是因为您的方法需要List<Object>
并且您给它List<String>
。
第一次阅读本文时可能会出现奇怪现象,List<String>
不是List<Object>
。
在您的示例中,您不会修改列表的内容,但让我们想象一下您要添加新元素的方法。
public static void addIt(List<Object> l, Object o)
{
l.add(o);
}
public static void main(String[] args) {
List<String> l =new ArrayList<>();
l.add("A");
addIt(l, new Integer(1)); // What?! you want to add an Integer to a List<String>!!!!
}
您必须使用通配符(?
)或解决您的问题以便列出您的问题。
public static void printIt(List<?> l) //or printIt(List<? extends Object> l)
{
System.out.println(l);
}
printIt(Arrays.asList("A"))
的情况略有不同。这是因为泛型是通过type inference在泛型方法上动态确定的。
List<Object> l = Arrays.asList("A"); //this is valid, the generic type is determined from the type we expect in this declaration.
答案 2 :(得分:2)
为了帮助您理解这一点,这是另一个编译代码示例,它演示了来自返回类型的类型推断:
24/02/2016
答案 3 :(得分:0)
所以@csharpfolk提到它是关于&#34; Type Inference&#34;!
以下文件可能有助于理解背后的想法!
https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html