java 数组的协变和逆变

Wesley13
• 阅读 527

先说结论:

  1. 基元类型数组不允许协变和逆变,无法编译通过。
  2. 引用类型数组允许协变和逆变,逆变时会检查实际类型,如果不相符则抛出java.lang.ClassCastException。

下面是验证代码。

 1 public class TestArrayInstance {
 2     public static void main(
 3         String[] args
 4     ) {
 5         char[]      a1 = {'1', '2', '3'};
 6         int[]       a2 = {1, 2, 3};
 7         long[]      a3 = {1L, 2L, 3L};
 8         float[]     a4 = {1.0F, 2.0F, 3.0F};
 9         double[]    a5 = {1.0, 2.0, 3.0};
10         Integer[]   a6 = {1, 2, 3};
11         Long[]      a7 = {1L, 2L, 3L};
12 
13         String[]    a8 = {"1", "2", "3"};
14         Object[]    a9 = {"1", 2L, 3};
15 
16         printCheck(a1, Character[].class);
17         printCheck(a1, Object[].class);
18         printCheck(a2, Integer[].class);
19         printCheck(a2, Object[].class);
20         printCheck(a2, Long[].class);
21         printCheck(a2, long[].class);
22         printCheck(a3, Long[].class);
23         printCheck(a3, double[].class);
24         printCheck(a4, Float[].class);
25         printCheck(a4, Double[].class);
26         printCheck(a4, double[].class);
27         printCheck(a5, Double[].class);
28         printCheck(a6, Long[].class);
29         printCheck(a6, int[].class);
30         printCheck(a6, long[].class);
31         printCheck(a7, Double[].class);
32         printCheck(a7, long[].class);
33         printCheck(a7, int[].class);
34         printCheck(a8, Object[].class);
35         printCheck(a9, String[].class);
36     }
37 
38     private static void printCheck(
39         Object v,
40         Class<?> c
41     ) {
42         System.out.println(paddingClassName(v.getClass()) + " instanceof " + paddingClassName(c) + (c.isInstance(v) ? " true" : " false"));
43     }
44 
45     private static String paddingClassName(
46         Class<?> c
47     ) {
48         return (c.getSimpleName() + "            ").substring(0, 12);
49     }
50 }

执行结果:

char[]       instanceof Character[]  false
char[]       instanceof Object[]     false
int[]        instanceof Integer[]    false
int[]        instanceof Object[]     false
int[]        instanceof Long[]       false
int[]        instanceof long[]       false
long[]       instanceof Long[]       false
long[]       instanceof double[]     false
float[]      instanceof Float[]      false
float[]      instanceof Double[]     false
float[]      instanceof double[]     false
double[]     instanceof Double[]     false
Integer[]    instanceof Long[]       false
Integer[]    instanceof int[]        false
Integer[]    instanceof long[]       false
Long[]       instanceof Double[]     false
Long[]       instanceof long[]       false
Long[]       instanceof int[]        false
String[]     instanceof Object[]     true
Object[]     instanceof String[]     false
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
onlyloveyd onlyloveyd
3年前
协变和逆变
本文同步发表于我的微信公众号,在微信搜索OpenCVorAndroid即可关注。协变、逆变概念许多程序设计语言的类型系统支持子类型。例如,如果Cat是Animal的子类型,那么Cat类型的表达式可用于任何出现Animal类型表达式的地方。所谓的变型(variance)是指如何根据组成类型之间的子类型关系,来确定更复杂的类型之间(例如C
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java开发者容易犯的十个错误
!(https://oscimg.oschina.net/oscnet/c9f00cc918684fbe8a865119d104090b.gif)Top1.数组转换为数组列表将数组转换为数组列表,开发者经常会这样做:\java\List<StringlistArrays.asList(arr);Arr
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这