从字节码角度分析java泛型数组的问题
来源:互联网 发布:剑三纯阳捏脸数据女 编辑:程序博客网 时间:2024/06/08 14:34
关于java的泛型数组这个问题,之前就有遇到过,不过当时以为是自己代码语法错误的问题,现在系统地对java的基础知识进行深入总结,才发现这个问题某种程度是和泛型的类型擦除机制有关,其实我觉得这个解释有它的道路但是还是比较勉强。下面我们从字节码角度试图去分析一下java某种意义上是不支持泛型数组原因
比如源码:
List<String>[]list3 = new ArrayList<String>[10];//错误定义格式
List<String>[]list3 = new ArrayList[10]; //正确定义格式
List<Long>l = new ArrayList<Long>();
l.add(99l);
Object[] o=list3;
o[0]=l;
list3[0].get(0).length();
字节码:
java.util.List<java.lang.String>[]list3;
descriptor: [Ljava/util/List;
flags:
Signature: #16 //[Ljava/util/List<Ljava/lang/Strin
g;>;
61: aload_0
62: bipush 10
64:anewarray #29 // class java/util/ArrayList
67: putfield #31 // Fieldlist3:[Ljava/util/List;
70: new #29 // class java/util/ArrayList
73: dup
74: invokespecial #33 // Methodjava/util/ArrayList."<in
it>":()V
77: astore_1
78: aload_1
79: ldc2_w #34 // long 99l
82: invokestatic #36 // Methodjava/lang/Long.valueOf:(
J)Ljava/lang/Long;
85: invokeinterface #42, 2 // InterfaceMethod java/util/List.
add:(Ljava/lang/Object;)Z
90: pop
91: aload_0
92: getfield #31 // Fieldlist3:[Ljava/util/List;
95: astore_2
96: aload_2
97: iconst_0
98: aload_1
99: aastore
100: aload_0
101: getfield #31 // Fieldlist3:[Ljava/util/List;
104: iconst_0
105: aaload
106: iconst_0
107: invokeinterface #48, 2 // InterfaceMethod java/util/List.
get:(I)Ljava/lang/Object;
112: checkcast #52 // class java/lang/String
115: invokevirtual#54 // Methodjava/lang/String.length:
()I
118: pop
--在代码中,我们通过巧妙的步骤用List<Long>对象填充到了List<String>[]数组中,注意红色部分,我们执行list3[0].get(0).length();时其实list3[0]的类型已经是List<Long>,所以list3[0].get(0)其实运行时得到的是Long类型对象,但是编译器是没这么聪明的,它还是遵循正常的类型擦除机制对get到的Object对象进行类型转换checkcast,这样就会使我们代码运行时会爆出类型转换的异常。这种情况或许能作为解释java不支持泛型数组的一个理由。
- 从字节码角度分析java泛型数组的问题
- 从字节码角度理解一些java 问题
- 从字节码角度分析泛型类,泛型方法,泛型接口的实现机制(类型擦除)
- 从字节码角度分析接口中的成员域
- 从字节码角度看String的连接操作
- 从java内存分配角度分析android内存泄漏问题
- 编辑从字节码和 JVM 的角度解析 Java 核心类 String 的不可变特性
- 从Java角度分析Python的入门介绍
- 从字节码角度分析Byte类型变量b++和++b
- 从内存角度分析:数组删除自己内部指定对象和通过函数形参改值问题
- Java 函数调用是传值还是传引用? 从字节码角度来看看!
- Java 函数调用是传值还是传引用? 从字节码角度来看看!
- 从实例角度分析Java设计模式
- GC问题的分析角度
- 从字节码的角度来看try-catch-finally和return的执行顺序
- 从字节码角度理解JVM异常处理机制的原理
- 从编译器角度分析C语言中数组名和指针的区别
- 从编译器角度分析C语言中数组名和指针的区别
- Swagger Adoption
- java查询功能输入**中文字符乱码**问题:
- Less 命令
- MySQL系列课程之三MySQL的登录
- poj 1631 简单的LIS问题
- 从字节码角度分析java泛型数组的问题
- hdu2145
- 两分钟搞定极光推送
- 二、垃圾收集与内存分配策略
- Socket通信
- Hibernate中的query.setFirstResult(),query.setMaxResults();
- 伪分布式Hadoop系统上的wordCount实现命令
- Bsmtp.dll和Bsendm.exe结合发送邮件
- 世界公认最健康健身作息时间表!