V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  amiwrong123  ›  全部回复第 36 页 / 共 40 页
回复总数  794
1 ... 28  29  30  31  32  33  34  35  36  37 ... 40  
2019-10-09 09:46:11 +08:00
回复了 amiwrong123 创建的主题 Java Java 编程思想 一个小例子编译不过
@cigarzh
难道编译器真的会蒙蔽吗,我看 import 语句是 import net.mindview.util.*; 看图片,那个类 net.mindview.util.RandomGenerator.String,那么 import net.mindview.util.RandomGenerator.String 去掉导入的 net.mindview.util.*,这个名字应该是 RandomGenerator.String 啊,不会歧义啊==
2019-09-29 10:20:38 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型方法与通配符 其中的类型推断该如何理解?
@secondwtq
话说大佬可以帮忙解释一下 exact2 函数为什么会有编译错误吗?
仅仅是因为,两个形参都要求确切的类型,所以两个实参里不能有一个带通配符的吗?
2019-09-29 10:18:29 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型方法与通配符 其中的类型推断该如何理解?
@secondwtq
谢谢层主,刚看还有点没看大东,多看了几遍大概懂了。话说你是从哪里知道这些知识,感觉我又学到了很多。

首先我才意识到 bottom type 是 null,以前一直以为 java 有上限,没下限。

可能你的分析过程我理解得比较浅显:首先编译器总会找到最合适的推断类型出来,使得泛型方法可调用。且<?>的范围代表了所有类型。

1. wildSubtype 中,由于一个形参推断出来为 Long,一个形参推断出来为?,所以 T 可以被推断为 Long/Number/Object。但为了形参<? extends T>的范围大于等于实参<?>的范围,T 必须被推断为 Object,才可以。

2.wildSupertype 中,同样,由于一个形参推断出来为 Long,一个形参推断出来为?,所以 T 可以被推断为 Long/Number/Object。但形参是<? super T>,无论 T 被推断哪个,其形参的范围都无法大于等于实参<?>的范围。(说得形象点,此函数中,形参的范围是从 Long 到 top,而实参的范围是从 bottom 到 top )
2019-09-28 21:12:45 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型方法与通配符 其中的类型推断该如何理解?
@Mistwave
谢谢,你说这两点就是<? extends T> 及 <? super T>这两种引用的合法操作和限制操作了吧(一种合法的是“读操作”,另一个是“写操作”)。

你这篇文章也不错,话说你们都喜欢看英文文档啊,我要是能看看 java 官网文档就不错了。。。

主要还是不懂在于,泛型方法上,涉及了通配符(可能是形参涉及了、也可能是实参涉及了)的类型推断,编译器为啥会报这个错==
2019-09-28 21:08:09 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型方法与通配符 其中的类型推断该如何理解?
@oneisall8955
哈哈哈,上次你就给推荐过啦。看了,介绍了<? extends T> 及 <? super T>这两种引用的合法操作和限制操作,不错。但我这里,主要不懂在于,泛型方法上,涉及了通配符的类型推断,编译器为啥会报这个错==
(悄悄地说,等会写博客准备把你那个 copy 的 jdk 例子写进去,哈哈哈)
2019-09-28 21:03:25 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型方法与通配符 其中的类型推断该如何理解?
@aguesuka
怎么个有问题法呀
2019-09-28 21:03:08 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型方法与通配符 其中的类型推断该如何理解?
@realPipiz
谢谢,看了。介绍泛型的知识很广,但没有我所疑问的点。
2019-09-28 21:01:20 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型方法与通配符 其中的类型推断该如何理解?
@putin541
你的理解貌似也很有道理。但偏偏 wildSubtype 函数接受同样的实参,却不会报编译错误了,这该如何解释呢
2019-09-26 11:49:20 +08:00
回复了 lcj2class 创建的主题 程序员 对 CSDN 佩服地五体投地
我却还在 csdn 写博客,可能该考虑换成博客园了
2019-09-25 12:04:45 +08:00
回复了 amiwrong123 创建的主题 程序员 为啥说成“字节码是 0101”就会遭到这样的口诛笔伐
@realpg
谢谢回答,懂啦。哎,出言不慎闹了个笑话。
2019-09-25 01:44:45 +08:00
回复了 amiwrong123 创建的主题 程序员 为啥说成“字节码是 0101”就会遭到这样的口诛笔伐
@lujjjh
嗯,还是你懂我,不过你讲的思路比较清晰。我只是想简单讲一下字节码的概念,然后引出泛型的原理和类型擦除。
2019-09-25 01:06:25 +08:00
回复了 amiwrong123 创建的主题 程序员 为啥说成“字节码是 0101”就会遭到这样的口诛笔伐
@fuxiaohei
直接说 0101 就认为,0101=二进制文件=机器码,这样呗
2019-09-24 21:34:19 +08:00
回复了 amiwrong123 创建的主题 程序员 为啥说成“字节码是 0101”就会遭到这样的口诛笔伐
@wwti9
那可以说成,符合 jvm 规范的 0101 吗
2019-09-12 17:21:51 +08:00
回复了 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);到底是怎么执行成功的呢。

有点笨,见谅哈==
2019-09-12 11:15:49 +08:00
回复了 amiwrong123 创建的主题 程序员 Java 泛型擦除与补偿的迷惑
@zgqq
@napsterwu
@bkmi
@guyeu
@Raymon111111
@shily
@leafin
各位大佬,能否帮忙看一下附言 2 关于泛型数组的我的理解对吗?
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 才行啊。。
1 ... 28  29  30  31  32  33  34  35  36  37 ... 40  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2734 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 19ms · UTC 00:17 · PVG 08:17 · LAX 16:17 · JFK 19:17
Developed with CodeLauncher
♥ Do have faith in what you're doing.