返回信息流java不是有泛型擦除么,那怎样获得java泛型的实际类型呢
这是一条镜像帖。来源:北邮人论坛 / java / #40230同步于 2015/4/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求问大神,怎样获得java泛型的实际类型
laobaoer
2015/4/28镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这是JVM的一个问题。泛型的类型参数只在编译时保留,作为类型检查用;编译成bytecode就擦除了。所以,运行时没法得到这个信息。这么做的目的是和以前的java版本兼容(当然,这个决定是2004年左右做的。如果当时他们狠心一点,java会比现在好得多。
.net没有这个问题。
他们现在狠心一下会如何?
【 在 nuanyangyang (暖羊羊) 的大作中提到: 】
: 这是JVM的一个问题。泛型的类型参数只在编译时保留,作为类型检查用;编译成bytecode就擦除了。所以,运行时没法得到这个信息。这么做的目的是和以前的java版本兼容(当然,这个决定是2004年左右做的。如果当时他们狠心一点,java会比现在好得多。
: .net没有这个问题。
【 在 icyfox 的大作中提到: 】
: 他们现在狠心一下会如何?
:
一个新的JVM会诞生,原有的Java的二进制包将会变得不兼容(好像也不见得,理论上可以兼容的),但源代码应该可以编译到新的JVM上。之后的Java就应该可以做类似ArrayList<int>这样的事了。
获取不到,所以一般只能通过传Class对象的方式
【 在 laobaoer 的大作中提到: 】
: java不是有泛型擦除么,那怎样获得java泛型的实际类型呢
暖神觉得CLR和JVM哪个好?
【 在 nuanyangyang 的大作中提到: 】
: 这是JVM的一个问题。泛型的类型参数只在编译时保留,作为类型检查用;编译成bytecode就擦除了。所以,运行时没法得到这个信息。这么做的目的是和以前的java版本兼容(当然,这个决定是2004年左右做的。如果当时他们狠心一点,java会比现在好得多。
: .net没有这个问题。
觉得.Net这个处理的没有Java好。
c井的List<int>和List<bool>是两个类。还是在runtime生成的。然后有一堆处理的机制。。。
Java处理的比较简单,大家都是Object。
不过之前有在面试的时候被问到Java泛型擦除会不会造成性能问题 =_= 所以估计这个可能有性能问题?
【 在 nuanyangyang 的大作中提到: 】
: 这是JVM的一个问题。泛型的类型参数只在编译时保留,作为类型检查用;编译成bytecode就擦除了。所以,运行时没法得到这个信息。这么做的目的是和以前的java版本兼容(当然,这个决定是2004年左右做的。如果当时他们狠心一点,java会比现在好得多。
: .net没有这个问题。
【 在 wolfer 的大作中提到: 】
: 暖神觉得CLR和JVM哪个好?
我更喜欢clr的设计。但JVM有高质量的开源实现(微软的coreclr刚开源不久)
【 在 aiquestion 的大作中提到: 】
: 觉得.Net这个处理的没有Java好。
: c井的List<int>和List<bool>是两个类。还是在runtime生成的。然后有一堆处理的机制。。。
: Java处理的比较简单,大家都是Object。
: ...................
运行时生成的不是问题。一方面,如果是运行时生成,可以在只有用到的时候生成,编译期更快(可怜的C++,编译一个程序几个小时有木有);运行时编译还带来了优化的机会(可怜的C++,编译以后再也没机会优化了有木有)。