public class Util {
public static <T> void printList(List<T> list){
for (Object obj : list){
System.out.println(obj);
}
}
public static void printListWithWildCard(List<?> list){
for (Object obj : list){
System.out.println(obj);
}
}
}
public class Main {
public static void main(String arg[]){
Util.printList(Arrays.asList("test",2,3));
Util.printListWithWildCard(Arrays.asList("test",2,3));
}
}
在 printList()和 printListWithWildCard()方法中,将参数作为List<T> list
接受并将参数作为List<?> list
接受时有什么区别??
答案 0 :(得分:0)
在这两种方法中,你实际上只是打印列表的内容,这样可以欺骗你的思想,但真正的问题是在这种方法中,
printListWithWildCard(List<?> list)
java不知道列表持有什么阻止你用它做一些操作......
让我用这个例子解释自己:
public static <T> void printList(List<T> list) {
list.add(list.get(0));
}
public static void printListWithWildCard(List<?> list) {
list.add(list.get(0));
}
现在尝试编译该代码,您将看到出现错误:
类型List中的方法add(capture#1-of?)不是 适用于参数(捕获#2-of?)
答案 1 :(得分:0)
在使用List<T>
时,我们将此列表指定为特定对象的列表。
喜欢,如果我们要创建Person对象的列表。然后我们可以将其称为List<Person>
但是如果Employee是Person类的子类,并且如果我们想要Person的列表或Person的子类列表那么我们可以使用通配符。
赞,List<? extends Person>
然后我们可以将列表作为List<Person>
或List<Employee>
传递。
如果您将列表定义为List<T>
和| List`,则当前两者都相同,没有区别。但实际使用通配符是为了定义任何对象的子类或父类。