一楼说的“任意”,改成“未知”更准确一些。区别一: List<? extends Map<String, ?>> data ,不能往 data 添加任何(除了null之外的)元素,因为 data 这个 List 中的元素是 "Map 的某种子类型",具体是哪种子类型不清楚。区别二: 跟区别一相似,遍历data中的元素时, Map<String, ?> 不能 put (除了null之外) 的任何value。
Map<String, ?> m = new HashMap<String, Object>(); m.put("one", "two"); //这句话报错感谢8楼,继续追问, 既然无法添加除null之外的元素,它的用处主要在哪些地方?貌似在定义函数返回类型的时候才有点用。
List里面存储为Map或者它的任何子类
Map中存储的Key为String类型value为任意
但是这样用,有点别扭,平时应该用的不多。
追问一下,和下面的有什么区别?List<Map<String, Object>> data;
一楼说的“任意”,改成“未知”更准确一些。区别一: List<? extends Map<String, ?>> data ,不能往 data 添加任何(除了null之外的)元素,因为 data 这个 List 中的元素是 "Map 的某种子类型",具体是哪种子类型不清楚。区别二: 跟区别一相似,遍历data中的元素时, Map<String, ?> 不能 put (除了null之外) 的任何value。
Map<String, ?> m = new HashMap<String, Object>();
m.put("one", "two"); //这句话报错感谢8楼,继续追问,
既然无法添加除null之外的元素,它的用处主要在哪些地方?貌似在定义函数返回类型的时候才有点用。
就是这样。定义函数的参数也可以用。
总的来说,这样定义的变量就是用来读的,不是用来写的。泛型用来做编译时的类型检查。
wildcard,用来对要检查的类型作更灵活一些的限定。
wildcard 有 <?> 或者 <? extends XXX> 或者 <? super XXX>。
实际上JAVA的泛型仅仅是语法糖,在编译阶段保证类型的安全性。
实际上编译通过后,没有什么区别