null :o :o :o
4条回答 默认 最新
- iteye_1858 2013-01-11 11:42关注
为了叙述方便,我把Set改为List,因为Set没有getter方法
List向前兼容,不带泛型的容器。它不做任何泛型检查。例如你可以写:
[code="java"]
List list = new ArrayList();
list.add("s");
String s = (String) list.get(0); //list.get(0)的返回类型是Object
System.out.println(s);
[/code]
完全可以正确运行。List<?>的?后如果不加extends或者super修饰的话,相当于List<? extends Object>,它是所有List的父类。但在使用List<?>的实例时,方法参数中的泛型参数将无法适配任何实际变量,而返回值中的泛型参数将变为<? extends T>中的T(单独写<?>则取缺省值Object)。例如
[code="java"]
List<? extends Number> list = new ArrayList(3); //容器List<? extends Number>是容器List的父类
//List list2 = new ArrayList(3); //编译出错,容器List不是容器List的父类。
list.add(3); //编译出错。但去掉这行后后续代码能正确运行。
final Number n = list.get(0);
System.out.println(n);
[/code]使用泛型通配符?可以把容器元素的继承关系推导到容器本身上,但限制了带泛型参数方法的使用。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报