V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  amiwrong123  ›  全部回复第 32 页 / 共 35 页
回复总数  699
1 ... 24  25  26  27  28  29  30  31  32  33 ... 35  
2019-09-11 17:54:42 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@pursuer
准确的说,泛型代码的字节码没有变化。但是在主函数的调用 create 方法的地方,会隐式地加一句强制类型转换。
2019-09-11 17:50:40 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@pursuer
有影响的,泛型除了检查外,在明确指定了泛型的具体类型后( ArrayMaker<String> stringMaker = new ArrayMaker<String>(String.class);),返回 T 类型的方法会隐式地加一句强制类型转换,这一点我刚才通过 javap 看 java 汇编看出来了的。
2019-09-11 14:10:20 +08:00
回复了 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,然后隐式地在这里加了一句强制类型转换呗。
2019-09-11 11:05:52 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@Raymon111111
确实想研究一下了,Class 到底是怎么存储实际类型的。

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

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

但“它本身就是类型信息”,这句我可能还没怎么理解==(虽然我知道 Class 对象的大概用法)
2019-09-11 10:21:47 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@bkmi
等一下,我有点蒙,左边右边不都是 Class 对象吗,怎么还有子类和基类
2019-09-11 09:32:46 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@zgqq
Class<T>类作为一个泛型类,它是怎么保存实际类型信息的呢?它就是要特殊一点是吗
2019-09-08 13:55:30 +08:00
回复了 amiwrong123 创建的主题 Java Java 泛型方法与多态,这样解释对吗
@Bromine0x23
不好意思,刚才没注意到那个静态方法的返回值。修改静态方法后可执行。

经过测试发现,虽然成员的泛型方法和泛型类用了同一个标识符 T,但是成员泛型方法的 T 并没有被对象的具体类型 CountedObject 所覆盖,而是独立于对象的。
2019-09-08 13:25:24 +08:00
回复了 amiwrong123 创建的主题 Java Java 泛型方法与多态,这样解释对吗
@oneisall8955
是通配符方面的知识哈,等我看书看到这块再去观摩你的博客把。
话说层主能否帮看下附言 2,不知道我的理解对吗。。
2019-09-08 12:20:55 +08:00
回复了 amiwrong123 创建的主题 Java Java 泛型方法与多态,这样解释对吗
@Bromine0x23
大佬,能否再帮忙看下附言 2 的疑问,感谢!
是不是成员泛型方法的 T 被泛型类的 T 覆盖掉了。
2019-09-07 23:02:45 +08:00
回复了 amiwrong123 创建的主题 Java Java 泛型方法与多态,这样解释对吗
@ninjachen
不好意思,创造了个新词汇 囧 rz
2019-09-07 19:59:42 +08:00
回复了 amiwrong123 创建的主题 Java Java 泛型方法与多态,这样解释对吗
@cigarzh
主要类型参数推断理解错了
2019-09-07 17:38:33 +08:00
回复了 amiwrong123 创建的主题 Java Java 泛型方法与多态,这样解释对吗
@Bromine0x23
谢谢回答。但 A a = gm.f1(new B());这里该怎么理解呢,照你这么说,意思就是,有了方法参数的推断,就不需要返回值的推断了。那这里 f1 的 T 就被推断为 B 了呗。

只是 gm.f1(new B())返回了一个 B 对象,然后由于赋值,向上转型为了一个 A 对象。
2019-09-07 16:53:31 +08:00
回复了 amiwrong123 创建的主题 Java Java 泛型方法与多态,这样解释对吗
@Bromine0x23
可是我觉得类型参数也能通过返回值处的类型参数推断啊。比如:
```java
class GenericMethods {
public <T> T f2(Object x) {
System.out.println(x.getClass().getName());
return (T)x;
}
}

public class testP {
public static void main(String[] args) {
GenericMethods gm = new GenericMethods();
int o1 = gm.f2(2);
String o2 = gm.f2(2);//能通过编译,但运行时报错
}
}
```
这里可以认为,执行`String o2 = gm.f2(2)`后,由于这里`T`就被推断为了`String`,一个实际为 2 的 Object 对象在向上转型为`String`类型后,执行(String)x,这句会受到 RTTI 的检查,被发现无法转型后便报错。
2019-09-06 23:31:59 +08:00
回复了 liudaqi 创建的主题 问与答 回调函数的“调”是读“条”还是读“掉”?
让我想起来那个帖子:“希哈(嘻哈)值还是哈希值”
@dorothyREN
决定了,下次重装系统用企业版的。
@TangMonk
谷歌也差不多,也是那些复制粘贴的东西。难道说我应该搜索英文关键字吗
@dorothyREN
企业版有什么独到之处啊
@dyxLike
原来"启用虚拟打印机"可以解决黑屏,学到了。但你这没完全解决哈
1 ... 24  25  26  27  28  29  30  31  32  33 ... 35  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1751 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 22ms · UTC 16:55 · PVG 00:55 · LAX 09:55 · JFK 12:55
Developed with CodeLauncher
♥ Do have faith in what you're doing.