首页 > 代码库 > 38_泛型的通配符扩展应用
38_泛型的通配符扩展应用
-
问题:
-
定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据,该方法如何定义呢?
-
错误的方式
public static void printCollection(Collection<Object> cols){ for(Object obj:cols){ System.out.println(obj); } /** cols.add("string");//没错 cols=new HashSet<Date>();//会报告错误! */}
-
正确的方式:
public static void printCollection(Collection<?> cols){ for(Object obj:cols){ System.out.println(obj); } /** cols.add("string");//错误,因为他不知道自己未来匹配就一定是Stirng cols.size();//没错,此方法与类型参数没有关系 cols=new HashSet<Date>();//没错,可以和 Collection<?>画等号 */}
- 总结:
- 使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
上图中,大红叉的方法都是和类型相关的,在使用泛型通配符?时,不能调用。
Collection<?> a可以和任意参数化的类型匹配,但到底匹配的是什么类型,只有以后才知道,所以,
a=new ArrayList<Integer>();和 a= new ArrayList<String>();都可以,但a.add(new Date);或者 a.add("abc");都不行。
Cols<Object>中的Object只是说明Cols<Object>实例对象中的方法接收的参数是Object
Cols<Object>是一种具体类型,new HashSet<Date>也是一种具体类型,两者没有兼容性。
-
泛型中?通配符的扩展
-
限定通配符的上边界
-
正确 Vector<? extends Number> x=new Vector<Integer>();
-
错误 Vector<? extends Number> x=new Vector<String>();
-
限定通配符的下边界
-
正确 Vector<? super Integer> x=new Vector<Number>();
-
错误 Vector<? super Integer> x=new Vector<Byte>();
-
提示
-
限定通配符总是包括自己
38_泛型的通配符扩展应用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。