以List<T>为例,通常如果我们想在List中存储某种类型的数据,我们会用下面的语法进行声明和使用:

         List<String> allMsg = new ArrayList<String>();
allMsg.add("hello");
allMsg.add("world"); for(String msg : allMsg)
{
System.out.println("[类型:" + msg.getClass().getSimpleName() + ",值:" + msg + "]");
}

上面代码的数据结果:

[类型:String,值:hello]
[类型:String,值:world]

这里,数据源allMsg是已知的List<String>类型。但我们如果用List去接收List<String>会是什么效果呢?结果是,List中的所有数据都变成Object类型了,我们甚至能将Integer传入到List节点中,这样破坏了泛型的设计初衷--保持集合中元素类型的一致性(编译时安全检查)。请看下面的代码:

         List allMsg = new ArrayList<String>();
allMsg.add("hello");
allMsg.add("world");
allMsg.add(999); for(Object msg : allMsg)
{
System.out.println("[类型:" + msg.getClass().getSimpleName() + ",值:" + msg + "]");
}

输出结果:

[类型:String,值:hello]
[类型:String,值:world]
[类型:Integer,值:999]

有时候,我们想用一个变量接受各种类型的数据,如List<String>或者List<Integer>,我们可以用通配符“?”作为泛型。代码如下:

         List<String> allMsg = new ArrayList<String>();
List<?> genericList = allMsg; for (Object msg : allMsg)
{
System.out.println("[类型:" + msg.getClass().getSimpleName() + ",值:" + msg + "]");
}

一旦用?作为泛型类型,该变量变为只读变量,不能更改内容,下面的代码无法通过编译:

Java中泛型通配符的一点概念的更多相关文章

  1. Java中泛型 类型擦除

    转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...

  2. Java中泛型使用

    Java中泛型使用 泛型作用: 泛型:集合类添加对象不用强转 反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码: ArrayList<Ls> ff=new ArrayList ...

  3. Java 之泛型通配符 ? extends T 与 ? super T 解惑

    简述 大家在平时的工作学习中, 肯定会见过不少如下的语句: List<? super T> List<? extends T> 我们都知道, 上面的代码时关于 Java 泛型的 ...

  4. Java 中泛型的全面解析(转)

    Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在J ...

  5. Java中泛型的详细解析,深入分析泛型的使用方式

    泛型的基本概念 泛型: 参数化类型 参数: 定义方法时有形参 调用方法时传递实参 参数化类型: 将类型由原来的具体的类型参数化,类似方法中的变量参数 类型定义成参数形式, 可以称为类型形参 在使用或者 ...

  6. Java中泛型在集合框架中的应用

    泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...

  7. Java中泛型区别以及泛型擦除详解

    一.引言 复习javac的编译过程中的解语法糖的时候看见了泛型擦除中的举例,网上的资料大多比较散各针对性不一,在此做出自己的一些详细且易懂的总结. 二.泛型简介 泛型是JDK 1.5的一项新特性,一种 ...

  8. Java 中 泛型的限定

         泛型 一般 出如今集合中,迭代器中 也会出现!      泛型 是为了 提高代码的 安全性. 泛型 确保数据类型的唯一性. 在我们经常使用的容器中.  越是 单一 约优点理啊!       ...

  9. Java中泛型的各种使用

    Java中的泛型的使用: 1.普通的泛型使用 在使用类的时候后面的<>中的类型就是我们确定的类型. public class MyClass1<T> {//此处定义的泛型是T ...

随机推荐

  1. day111 爬虫第一天

    一.模拟浏览器发请求. import requests r1 =requests.get( url ="https://dig.chouti.com/", headers ={ & ...

  2. openvswitch datapath 内核态流表创建过程(ovs_flow_cmd_new)

    datapath流表更新的入口函数都定义在dp_flow_genl_ops中,流表创建的入口函数是ovs_flow_cmd_new函数,通过该函数,我们可以一窥流表相关信息的建立. 1.ovs_flo ...

  3. 【2019年OCP新题】OCP题库更新出现大量新题-11

    11.Your database is in archivelog mode. You want to disable archiving for the database. Examine thes ...

  4. iterm2 恢复默认设置

    如果你设置了Iterm2的默认字体,然后感觉不好看又忘记默认字体是什么的时候 执行如下命令,重新启动iTerm2即可: defaults delete com.googlecode.iterm2

  5. Brainteaser-292. Nim Game

    You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...

  6. mysql 数据备份 crontab

    每天凌晨 2 点备份数据 crontab -e 0 2 * * * mysqldump ${mysqldir}/bin/mysqldump  -h$host -P$port -uadmin -p&qu ...

  7. window主机和centos主机之间相互传送文件

    命令实现linux和window文件传送 一:下载配置pscp软件从http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载p ...

  8. Python小白学习之路(十三)—【递归调用】

    一.递归调用定义 在函数内部,可以调用其他函数. 如果在调用一个函数的过程中直接或间接调用自身本身,则称为递归调用 从某种意义上来说,递归调用可以实现无限循环 二.递归调用的特性 必须有一个明确的结束 ...

  9. 使用git时出现Please make sure you have the correct access rights and the repository exists.问题已解决。

    使用git时,出现Please make sure you have the correct access rights and the repository exists.问题已解决. 今天我在使用 ...

  10. 服务器端 安装svn

    趁着这波比较闲的时候来划一波水,想起自己那都快生会的腾讯云服务器 到现在还不能通过版本控制系统上传文件,于是趁这波功夫在服务器上安装个svn来管理代码. 首先就简单的介绍一波 svn : 首先svn不 ...