[英]Java Generics List
以下是带有通配符的泛型示例
public static void printListItems(List<object> list) {
for (Object listItem : list)
System.out.println(listItem);
}
在此示例中,我们希望打印任何类型的列表项,但不能打印List<Integer>
, List<String>
等,因为它们不是List<Object>
子类型。 使用无界通配符可以解决此问题。
public static void printListItems(List<?> list) {
for (Object listItem : list)
System.out.println(listItem);
}
我在Java教程中阅读了以上代码。 对于第一个示例,它说它不起作用,因为List<String>
不是List<Object>
。
那么为什么要这样,在第二个示例中,for循环正在使用listItem作为Object
dataType并遍历List<String>
元素进行工作。
您正在遇到一个错误的矛盾,因为您将List<String>
和List<Object>
之间的关系等同于String
和Object
之间的关系。
在第一个示例中,如果您尝试使用List<String>
调用printListItem
,则编译器会大吼大叫,因为List<String>
不扩展List<Object>
。
换句话说:字符串列表不能被视为对象列表,因为(根据类型系统)字符串列表不是对象列表。
在第二个示例中,编译器不会对您大吼大叫,因为您将List
的String
元素视为Object
元素。 与列表不同, String
确实扩展了Object
。
换句话说:字符串可以被视为对象,因为(根据类型系统)字符串是对象。
当generic class
的类型声明包含wildcard character
,其子类类型可以在二维中扩展。
例如Collection <?扩展数字>
List and Set
都是Collection
子类类型,所以List<? extends Number> and Set<? extends Number>
List<? extends Number> and Set<? extends Number>
List<? extends Number> and Set<? extends Number>
都是Collection<? extends Number>
所有子类类型 Collection<? extends Number>
Collection<? extends Number>
Integer 、Double
都是Number
子类类型,因此Collection<Double> and Collection<Integer>
都是Collection <?的子类 。 扩展Number> 关于您的第二个内容,正如Andreas 在评论中解释的那样,List等于List <? 扩展Object>并基于第二维,扩展List <String>是List <?>的**子类**
您所做的不是通用的。 这是一个通用功能
public static <T> void printListItems(List<T> list) {
for (T listItem : list) {
System.out.println(listItem);
}
}
例:
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static <T> void printListItems(List<T> list) {
for (T listItem : list) {
System.out.println(listItem);
}
}
// arguments are passed using the text field below this editor
public static void main(String[] args) {
List<Integer> l = new ArrayList<>(Arrays.asList(1,2,3,4,5));
List<String> s = new ArrayList<>(Arrays.asList("Hello", "World"));
printListItems(l);
printListItems(s);
}
}
1
2
3
4
5
Hello
World
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.