首页   注册   登录
 amiwrong123 最近的时间轴更新

amiwrong123

V2EX 第 417414 号会员,加入于 2019-06-01 12:17:41 +08:00
今日活跃度排名 6013
这个味道,是BUG的味道!
amiwrong123 最近回复了
6 天前
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@guyeu
我才发现,如果是 java12,所以这样 Integer[] b = (Integer[]) new Object[] {};居然是能通过编译的。然后试了 java8,也是不可以的。


“而你的字节码里的强制类型转换是你的代码里原本就存在的,并不是编译器帮你加的。”(代码里也没有写(String[])的啊),难道你意思就是,因为 String[] stringArray = stringMaker.create(9);左边是 String[],所以就有了强制转换呗。但是,我觉得强制转换是需要自己写出来的啊,像这样 String[] stringArray = (String[])stringMaker.create(9);。毕竟 create 方法返回的是 Object[],从 // Method create:(I)[Ljava/lang/Object;也能看出来。

而且根据 java8 的测试,就算写了也是编译通不过。那这里 String[] stringArray = stringMaker.create(9);到底是怎么执行成功的呢。

有点笨,见谅哈==
6 天前
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@zgqq
@napsterwu
@bkmi
@guyeu
@Raymon111111
@shily
@leafin
各位大佬,能否帮忙看一下附言 2 关于泛型数组的我的理解对吗?
7 天前
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@pursuer
准确的说,泛型代码的字节码没有变化。但是在主函数的调用 create 方法的地方,会隐式地加一句强制类型转换。
7 天前
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@pursuer
有影响的,泛型除了检查外,在明确指定了泛型的具体类型后( ArrayMaker<String> stringMaker = new ArrayMaker<String>(String.class);),返回 T 类型的方法会隐式地加一句强制类型转换,这一点我刚才通过 javap 看 java 汇编看出来了的。
7 天前
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@shily
感谢回答,感觉有点弄清楚了。其实就是,虽然引用 Class<T>的类型参数被擦除了,但其 Class 对象还是没有改变。

专门去看了 Class 的源码,大概有这几个函数用了 T:
1. public T newInstance()
2. public TypeVariable<Class<T>>[] getTypeParameters()
3. public native Class<? super T> getSuperclass()
4. public Constructor<T> getConstructor(Class<?>... parameterTypes)
5. public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

以最常用的 newInstance 为例,以泛型的知识来理解,这里也应该是: 调用 newInstance 返回的是一个 Object,然后隐式地在这里加了一句强制类型转换呗。
7 天前
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@Raymon111111
确实想研究一下了,Class 到底是怎么存储实际类型的。

还有就是,既然泛型会进行擦除,Class 的源码设计成了 Class<T>这样的泛型到底有什么用。
7 天前
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@icris
所以 private Class<T> kind;这句里面的 T 并不会让泛型代码存储到实际类型,这是因为擦除。

但 kind 指向的那个东西就是实际类型呗。。总感觉我是不是该好好研究一下 Class 才行啊。。
7 天前
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@guyeu
泛型本来就会擦除,那肯定是也不能依靠泛型提供类型信息了。

但“它本身就是类型信息”,这句我可能还没怎么理解==(虽然我知道 Class 对象的大概用法)
7 天前
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@bkmi
等一下,我有点蒙,左边右边不都是 Class 对象吗,怎么还有子类和基类
7 天前
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@zgqq
Class<T>类作为一个泛型类,它是怎么保存实际类型信息的呢?它就是要特殊一点是吗
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1435 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 10ms · UTC 23:46 · PVG 07:46 · LAX 16:46 · JFK 19:46
♥ Do have faith in what you're doing.