诡异的Java语法,下面这句话神马意思?
List<? extends Map<String, ?>> data; --------------------编程问答-------------------- data 类型ListList里面存储为Map或者它的任何子类
Map中存储的Key为String类型value为任意 --------------------编程问答-------------------- 泛型语法,请翻书再说。 --------------------编程问答--------------------
这样写,把能校验的都校验一下,比不写的校验性强度大一些;而又比写成<Map>的扩展性大一点!
但是这样用,有点别扭,平时应该用的不多。 --------------------编程问答-------------------- 一楼正解,建议看看泛型的知识 --------------------编程问答-------------------- 泛型啊 是一样的 --------------------编程问答-------------------- 泛型 一楼正解! --------------------编程问答--------------------
追问一下,和下面的有什么区别?
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的泛型比STL差多了。。。 --------------------编程问答-------------------- java 泛型,使用的时候都用具体的泛型 --------------------编程问答--------------------
实际上JAVA的泛型仅仅是语法糖,在编译阶段保证类型的安全性。
实际上编译通过后,没有什么区别 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
补充:Java , Java SE