@
cheng6563 很多设计是因为脑子有坑是对的,但说句公道话,Java 泛型哪来的脑子有坑的设计,在就是根本没设计,搞得后来不适合用不坑的方式扩展了。( C++模板也是在完全没管参数多态的 C 上加的。)
核心标志就是 JVM 不支持泛型的类型元数据。这导致要么实现成 C++那种翻译时展开,要么类型擦除,都可以实现不依赖运行时元数据。
@
camliar 兼容性方面说得有问题。
如果选用编译时展开,仍然可以二进制兼容,类似 C++多了 name mangling 以后原则上也能支持 C ABI ,无非是要多出来 linkage convention 。相比 C++考虑互操作问题要求用户手动 extern "C"区分,这个在 Java 里可以隐式自动解决,毕竟 JVM 在 spec 层次上完全控制 loader 的细节,多加 phase 重新生成代码也不在话下。
只是这样毫无疑问地会更复杂,而在 Java 的维护者的潜意识中不太值罢了。
@
nothingistrue 工程上来讲.NET 那套更符合实际需求。
这不是靠山大不大的问题,而是如果没觉悟搞定多版本共存,二进制分发代码迟早变成 DLL hell 还可能到处依赖错误的屎山,要么就是用户自己实现备胎。这历史上已经重演了很多遍了。CLR 其实也不厚道,GAC 自己还是分版本的 hell ,如果把这方面控制权给用户(系统管理员)可能还不会那么烂。
@
dcsuibian TypedScript 作为动态语言情况有点不大一样。
原则上 ES 实现的 IR 不需要公开,TS 实现除了编译器,也可以多加辅助运行时实现类似 CLR 的元数据,甚至干脆 TS 自己一个库就实现了。所以就算一时比较坑,也不碍着以后再慢慢加上改进特性,而可以做到避免有明显的兼容性问题。( ES/TS 自己具体特性设计拉胯不够容易实现出来这样的运行时,非得依赖 ES 的运行时开洞,那就另说了。)
Java 不一样,JVM bytecode 就是 bytecode ,和 Java 源码是两回事。Java 作为静态语言就没这种扩展取代 bytecode 地位的余地,想要改掉就要差不多 Java 到 JVM 整个设计竖着砍一刀挖掉重新填埋。
@
someonedeng Go 是想学 CLR 这样在 C++和 Java 中间划清界限避免缺陷,结果画虎类犬:
www.infoq.cn/article/xprmcl5qbf6yvdroajyn