java 数组的协变和逆变

先说结论:

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

下面是验证代码。

1 1 public class TestArrayInstance { 2 2 public static void main( 3 3 String[] args 4 4 ) { 5 5 char[] a1 = {'1', '2', '3'}; 6 6 int[] a2 = {1, 2, 3}; 7 7 long[] a3 = {1L, 2L, 3L}; 8 8 float[] a4 = {1.0F, 2.0F, 3.0F}; 9 9 double[] a5 = {1.0, 2.0, 3.0}; 1010 Integer[] a6 = {1, 2, 3}; 1111 Long[] a7 = {1L, 2L, 3L}; 1212 1313 String[] a8 = {"1", "2", "3"}; 1414 Object[] a9 = {"1", 2L, 3}; 1515 1616 printCheck(a1, Character[].class); 1717 printCheck(a1, Object[].class); 1818 printCheck(a2, Integer[].class); 1919 printCheck(a2, Object[].class); 2020 printCheck(a2, Long[].class); 2121 printCheck(a2, long[].class); 2222 printCheck(a3, Long[].class); 2323 printCheck(a3, double[].class); 2424 printCheck(a4, Float[].class); 2525 printCheck(a4, Double[].class); 2626 printCheck(a4, double[].class); 2727 printCheck(a5, Double[].class); 2828 printCheck(a6, Long[].class); 2929 printCheck(a6, int[].class); 3030 printCheck(a6, long[].class); 3131 printCheck(a7, Double[].class); 3232 printCheck(a7, long[].class); 3333 printCheck(a7, int[].class); 3434 printCheck(a8, Object[].class); 3535 printCheck(a9, String[].class); 3636 } 3737 3838 private static void printCheck( 3939 Object v, 4040 Class<?> c 4141 ) { 4242 System.out.println(paddingClassName(v.getClass()) + " instanceof " + paddingClassName(c) + (c.isInstance(v) ? " true" : " false")); 4343 } 4444 4545 private static String paddingClassName( 4646 Class<?> c 4747 ) { 4848 return (c.getSimpleName() + " ").substring(0, 12); 4949 } 5050 }

执行结果:

1char[] instanceof Character[] false 2char[] instanceof Object[] false 3int[] instanceof Integer[] false 4int[] instanceof Object[] false 5int[] instanceof Long[] false 6int[] instanceof long[] false 7long[] instanceof Long[] false 8long[] instanceof double[] false 9float[] instanceof Float[] false 10float[] instanceof Double[] false 11float[] instanceof double[] false 12double[] instanceof Double[] false 13Integer[] instanceof Long[] false 14Integer[] instanceof int[] false 15Integer[] instanceof long[] false 16Long[] instanceof Double[] false 17Long[] instanceof long[] false 18Long[] instanceof int[] false 19String[] instanceof Object[] true 20Object[] instanceof String[] false
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

协变和逆变

本文同步发表于我的微信公众号,在微信搜索OpenCVorAndroid即可关注。协变、逆变概念许多程序设计语言的类型系统支持子类型。例如,如果Cat是Animal的子类型,那么Cat类型的表达式可用于任何出现Animal类型表达式的地方。所谓的变型(variance)是指如何根据组成类型之间的子类型关系,来确定更复杂的类型之间(例如C