首页 > 编程语言 >PECS 原则在 Java 中的体现

PECS 原则在 Java 中的体现

时间:2022-12-21 15:46:50浏览次数:36  
标签:PECS Java nums 体现 List 协变 泛型 new

如果需要取值, 应使用 ? extends T 作为数据结构泛型。
如果需要写值, 应使用 ? super T 作为数据结构泛型。

// java.util.Collections#copy
public static <T> void copy(List<? super T> dest, List<? extends T> src)

在 Java 中数组是支持协变的(不支持逆变), 但是列表中的泛型是不可变的。

Number[] nums = new Integer[10];  // ok
List<Number> numList = new ArrayList<Integer>(); // compile failed

数组支持协变因此存在一些问题:

Number[] nums = new Integer[10];
nums[0] = 0;
nums[1] = 1.1;  // compile success

上面这段代码可以通过编译, 但是在运行时将抛出 ArrayStoreException, 因为一个 Integer 的数组中无法存放 Double 类型的元素,因此对于协变来说写操作是不安全的。

在 Java 中泛型自身是不支持协变的, 所以对于泛型来说不存在这个问题。但是协变又是十分常用的特性, 借助协变可以帮助我们编写更加通用的代码, 所以在 Java 中支持在泛型中使用通配符(上界和下界)来实现泛型的协变和逆变。

List<?> 等同于 List<? extends Object>

List<? extends Number> numList = new ArrayList<Integer>();
List<? super Integer> intList = new ArrayList<Number>();

通过前面数组协变的例子可以得知: 对于协变来说写操作是不安全的, 同理: 对于逆变来说读操作是不确定的(对于使用泛型下界的例子来说, 我们无法确定从中获取到的数据的具体类型), 因此 Java 在编译器层面就禁止对使用泛型上界的对象进行写入操作, 从而保证了协变下的安全性, 而对于使用泛型下界的对象进行读取操作将返回 Object 类型。

标签:PECS,Java,nums,体现,List,协变,泛型,new
From: https://www.cnblogs.com/xtyuns/p/16996377.html

相关文章

  • JavaScript中数组中的方法
    将数组转换成字符串JavaScript方法 toString() 把数组转换为数组值(逗号分隔)的字符串。实例: varfruits=["Banana","Orange","Apple","Mango"]; ......
  • Java-IDEA破解下载
    IntelliJIDEA下载 一、访问官网下载链接1、点击Download下载,然后等待下载完成  2、开始安装,点击下一步 3、选择要安装的位置,然后点击下一步,这里我选择的是......
  • java数据类型转换有哪几种?看这篇就够了!
    前言在上一篇文章中,壹哥给大家讲解了Java中的数据类型,从此大家就知道了基本类型和引用类型,尤其是8种基本类型的使用和各自特点。但实际上数据类型的使用还有很多更深入的......
  • 一篇文章彻底明白java中的重要概念——注解
    1.注解基本概念 注解,什么是注解? 打开百度搜索     好,看不懂没关系一步一步慢慢来先不管注解,注释这个概念应该就很熟悉了,文档注释,单行注释,多行注释......
  • Java实现发送邮件
    Java实现发送邮件摘要:在做Java开发、安卓开发、web开发时,经常遇到邮箱绑定、邮箱找回密码等功能,在使用绑定邮箱并依靠邮箱发送验证码时,需要利用Java实现发送邮件的功能。本......
  • java修剪字节组
    publicstaticStringbyteArrToString(byte[]data,Stringencoding)throwsUnsupportedEncodingException{intindex=-1;for(bytet:data......
  • Java实现多种语言编译运行
    Java实现多种语言编译运行摘要:在Java开发过程中,经常会遇到使用Java实现某一个功能比其他语言要复杂,因此通常将该功能使用其他编程语言来完成后,再通过Java调用编译程序编译运......
  • 基于Java springboot+mybatis+mysql实现的校园新闻系统
    @目录一、系统介绍二、功能展示1.主页2.登录以及注册3.普通用户对新闻咨询的编辑、发布和删除4.管理员对新闻的审核发布和撤销取消发布三、代码展示四、获取源码一、系统......
  • JavaScript
    1、什么是JavaScriptJavaScript是一门世界上最流行的脚本语言Java、JavaScript没有任何关系,当初为了热门,所以在Script前面加上Java~~10天~一个合格的程序员,必须要精通......
  • Java 代码打印List中的类到Excel表中
    导出excel1.项目中添加jxl.jar文件:​​​jar包下载地址​​​2.“导出Excel”按钮事件代码JFileChoosersavefile=newJFileChooser();//文件选择对话框FileFi......