iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java generic中通配符的理解有哪些
  • 862
分享到

Java generic中通配符的理解有哪些

2023-06-17 10:06:22 862人浏览 八月长安
摘要

本篇文章给大家分享的是有关Java generic中通配符的理解有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。置换原则结合Java本身的一些面向对象的特性,我们很容易理解

本篇文章给大家分享的是有关Java generic中通配符的理解有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

置换原则

结合Java本身的一些面向对象的特性,我们很容易理解这么一个置换原则:

一个指定类型的变量可以被赋值为该类型的任何子类;一个指定某种类型参数的方法可以通过传入该类型的子类来进行调用。

总的来说,就是说我们使用的任何类型变量都可以用该类型的子类型来替换。

泛型中一种错误的继承关系

在泛型的编程中,我们考虑到子类型关系的时候,容易把一种关系给弄混淆,并错误的采用置换原则。

比如说:

List<Integer> ints = new ArrayList<Integer>();  ints.add(1);  ints.add(2);  List<Number> nums = ints; // compile error

在这段代码中,我们看到类型参数Integer是Number的子类型,就容易想当然的认为List<Integer>也是List<Number>的子类。实际上并不是。所以才会导致类型不匹配,产生编译时错误。

有点时候,我们觉得,这样的转换看似不能用到一个好处,就是利用对象之间继承的关系。要是我们能有一个列表,它既能处理某种类型的数据,还能处理该类型的所有子类型的数据,这样岂不是既能用到泛型的好处又可以用到对象关系的好处么?于是在这里就引出了通配符(wildcard)。

通配符(Wildcard)

在Java类库中Collection接口定义中有一个用到通配符的方法:

interface Collection<E> {  ...  public boolean addAll(Collection<? extends E> c);  ...  }

在addAll方法的描述里,可以接受Collection类型的参数。其中Collection中的类型参数可以为任何继承E的子类型。

因此,我们可以在实际代码中这么使用:

List<Number> nums = new ArrayList<Number>();  List<Integer> ints = Arrays.asList(1, 2);  List<Double> dbls = Arrays.asList(2.78, 3.14);  nums.addAll(ints);  nums.addAll(dbls);

在代码中我们可以看到,List<Integer>和List<Double>都是Collection<? extends Number>类型的子类。所以上面的方法中可以将Integer和Double两种类型的List传入到方法中。

通配符使用限制1:

使用通配符的泛型数据类型比较有意思,既然前面我们可以将其作为方法声明的参数,那么是否可以将它作为一个变量类型来直接创建变量呢?

看如下代码:

List<? extends Number> nums = new ArrayList<Integer>(); //compile error

实际上上面这段代码是编译通不过的。

通配符使用限制2:

既然不能用来直接创建变量对象,那么再看下面这段代码:

List<Integer> ints = new ArrayList<Integer>();  ints.add(1);  ints.add(2);  List<? extends Number> nums = ints;  nums.add(3.14); // compile error

这段代码的第5行会导致编译错误。在第4行代码中,我们将ints赋值给nums,表面上nums声明为一个List<Integer>的父类型,所以第4行编译正常。为什么第5行代码会出错呢?表面上看来,既然nums类型可以接受继承自Number的所有参数,那加一个Double类型的数据应该是没问题的。实际上我们再考虑一下这样会带来的问题:

nums本来引用的是一个继承自该类型的List<Integer>,如果我们允许加入Double类型的数据的话,那么ints这个Integer的List里面就包含了Double的数据,当我们使用ints的时候,和我们所期望的只包含Integer类型的数据不符合。

因此,这段代码也说明了一个问题,就是在? extends E这种通配符引用的数据类型中,如果向其中增加数据操作的话会有问题。所以向其中增加数据是不允许的。但是我们可以从其中来读取数据。

总结

通配符修饰的泛型不能用来直接创建变量对象。

通配符修饰相当于声明了一种变量,它可以作为参数在方法中传递。这么做带来的好处就是我们可以将应用于包含某些数据类型的列表的方法也应用到包含其子类型的列表中。相当于可以在列表中用到一些面向对象的特性。

以上就是Java generic中通配符的理解有哪些,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: Java generic中通配符的理解有哪些

本文链接: https://www.lsjlt.com/news/288553.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java generic中通配符的理解有哪些
    本篇文章给大家分享的是有关Java generic中通配符的理解有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。置换原则结合Java本身的一些面向对象的特性,我们很容易理解...
    99+
    2023-06-17
  • java中有哪些通配符
    这篇文章将为大家详细讲解有关java中有哪些通配符,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java...
    99+
    2023-06-14
  • Java中有哪些泛型通配符
    今天就跟大家聊聊有关Java中有哪些泛型通配符,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式...
    99+
    2023-06-14
  • word中的通配符有哪些
    在Word中,通配符主要有以下几种:1. 问号():表示匹配任意单个字符。例如,"ct"可以匹配"cat"、"cut"等单词。2. ...
    99+
    2023-09-29
    word
  • SQL中的通配符有哪些
    这篇文章主要介绍“SQL中的通配符有哪些”,在日常操作中,相信很多人在SQL中的通配符有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL中的通配符有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-27
  • java中通配符的使用规则有哪些
    本篇文章为大家展示了java中通配符的使用规则有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。说明定义in变量,使用上限通配符,使用extends关键字。用super关键字用下限通配符来定义ou...
    99+
    2023-06-20
  • SQL通配符有哪些
    SQL通配符有两种,一种是百分号(%)通配符,一种是下划线(_)通配符。1. 百分号(%)通配符:用于匹配任意字符(包括零个字符)。...
    99+
    2023-09-09
    SQL
  • 了解java中的通配符“?“
    目录 通配符的作用         先看一段代码         用通配符""后,代码变化         结论 通配符上界  通配符下界 对通配符上下界的注释理解及其练习代码   简记:  用于在泛型的使用,即为通配符. 在J...
    99+
    2023-09-17
    java 开发语言
  • jQuery选择器中的通配符有哪些
    这篇文章将为大家详细讲解有关jQuery选择器中的通配符有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.选择器(1)通配符:$("input[id^='code']&qu...
    99+
    2023-06-27
  • 通配符*和?有哪些区别
    这篇文章主要介绍通配符*和有哪些区别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!通配符*和的区别是“*”可以用来代替零个、单个或多个字符,而“?”仅可以使用代替一个字符;“*”表示匹配的数量不受限制,而“?”的匹配...
    99+
    2023-06-06
  • linux命令通配符有哪些
    Linux命令通配符有以下几种:1. 星号(*):匹配任意长度的任意字符。2. 问号():匹配任意单个字符。3. 方括号([ ]):...
    99+
    2023-08-24
    linux
  • oracle通配符转义的方法有哪些
    在Oracle中,可以使用以下方法对通配符进行转义:1. 使用转义字符(\):可以使用反斜杠字符(\)来转义通配符。例如,如果要查询...
    99+
    2023-08-31
    oracle
  • Struts2配置文件中使用通配符的方法有哪些
    Struts2配置文件中可以使用通配符的方法有以下几种:1. 通配符匹配所有请求:可以使用"action"配置来匹配指定目录下的所有...
    99+
    2023-08-08
    Struts2
  • 最新Java 泛型中的通配符讲解
    目录一、什么是类型擦除?二、案例实体准备三、常用的 ?, T, E, K, V, N的含义四、上界通配符 < extends E>五、下界通配符 < super...
    99+
    2024-04-02
  • java中的运算符有哪些
    这篇文章主要介绍“java中的运算符有哪些”,在日常操作中,相信很多人在java中的运算符有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java中的运算符有哪些”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • Sectigo OV通配符SSL证书有哪些优势
    Sectigo OV通配符SSL证书的优势有:1、有轻度业务审查,能确保申请组织是一个真实存在的实体;2、可以保护一个域名及其所有的下一级域名,能节约企业成本,且易于管理;3、使用2048位RSA签名密钥或使用椭圆曲线密码术,加密性强;4、...
    99+
    2024-04-02
  • Java泛型通配符的使用详解
    目录泛型在继承方面的体现通配符的使用 有限制条件的通配符的使用自定义泛型的测试泛型在继承方面的体现 类A是类B的父类,G<A>和G<B>二者不具有子...
    99+
    2023-01-13
    Java泛型通配符
  • 在JAVA中有哪些运算符
    这篇文章将为大家详细讲解有关在JAVA中有哪些运算符,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、算术运算符注意:不建议在其他表达式的内部使用++、–,这样很容易让人困惑实例:int x...
    99+
    2023-05-31
    java 运算符 中有
  • java中的条件运算符有哪些
    今天就跟大家聊聊有关java中的条件运算符有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,...
    99+
    2023-06-14
  • Java的修饰符有哪些
    小编给大家分享一下Java的修饰符有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java 修饰符Java语言提供了很多修饰符,主要分为两类:访问修饰符,非访...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作