博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
38_泛型的通配符扩展应用
阅读量:6446 次
发布时间:2019-06-23

本文共 1192 字,大约阅读时间需要 3 分钟。

  • 问题:

    • 定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据,该方法如何定义呢?

  • 错误的方式

public static void printCollection(Collection cols){    for(Object obj:cols){        System.out.println(obj);    }    /**    cols.add("string");//没错    cols=new HashSet
();//会报告错误! */}

 

  • 正确的方式:

public static void printCollection(Collection
cols){ for(Object obj:cols){ System.out.println(obj); } /** cols.add("string");//错误,因为他不知道自己未来匹配就一定是Stirng cols.size();//没错,此方法与类型参数没有关系 cols=new HashSet
();//没错,可以和 Collection
画等号 */}
  • 总结:
    • 使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

img_74b1e8d859cd5c8a1e59e78d73512410.jpg

上图中,大红叉的方法都是和类型相关的,在使用泛型通配符?时,不能调用。

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>();

    • 提示

      • 限定通配符总是包括自己

开始做,坚持做,重复做

转载地址:http://rsvwo.baihongyu.com/

你可能感兴趣的文章
Storm学习
查看>>
【重学计算机】机组D5章:指令系统
查看>>
json对象函数的好处
查看>>
Testlink解决大用例导入问题
查看>>
Webstorm常用快捷键备忘
查看>>
nginx 的windows 基本配置
查看>>
js滚动加载到底部
查看>>
关于mac远程链接window服务器以及实现共享文件
查看>>
angular的service与factory
查看>>
Redis慢查询,redis-cli,redis-benchmark,info
查看>>
mysql主从同步从库同步报错
查看>>
Virtualbox 虚拟机网络不通
查看>>
poj 1017 Packets 贪心
查看>>
java概念基础笔记整理
查看>>
play music
查看>>
self parent $this关键字分析--PHP
查看>>
CC_UNUSED_PARAM 宏含义的解释
查看>>
leetcode124二叉树最大路径和
查看>>
设计模式——中介者模式
查看>>
VI常用命令和按键
查看>>