c#和 Java 感觉好像,但是对泛型还是有疑问

2022-08-24 10:05:42 +08:00
 ghost024

深入 java 的泛型之后,类型擦除搞得我很难受,毕竟向前兼容,理解。但是我看到 c#却不是用类型擦除的方式,c#也不是从一开始就有泛型的,那是不是 c#推出泛型之后,是对老代码是不兼容的?但是我记得 c#也是在很多地方都有使用的,难道 c#不考虑向前兼容吗?

ps:java 的泛型我真的吐了,java 的泛型只是代码看着好像你知道他的类型了,但其实都是 object

4521 次点击
所在节点    程序员
40 条回复
thinkershare
2022-08-24 10:09:41 +08:00
.NET 添加泛型的时候是在 2.0, 而且在.NET 1.0 的时候就已经考虑了泛型, 只是因为时间来不及, 所以才推迟到 2.0, 然后 C#一开始就有值类型, 为了完全的堆栈控制和性能, 如果泛型实现为擦除, 就完全残废了, Java 添加泛型的时候, Java 已经投入生产很多年了, 这个问题知乎有详细的回答, 去看看就好了.
sun1991
2022-08-24 10:10:17 +08:00
不考虑. 2.0 带来泛型后, 和 1.1 彻底割裂了.
顺便鄙视下 JAVA 的残废泛型.
Chad0000
2022-08-24 10:10:50 +08:00
C 井 2.0 就有泛型了。C 井从来没有不兼容之前的代码。否则为啥说 C 井优雅
chendy
2022-08-24 10:17:13 +08:00
java 当初历史包袱一堆,C#后来的做的比 java 好不很正常么
cmdOptionKana
2022-08-24 10:19:30 +08:00
C#站在巨人(Java)的肩膀上。
guaike
2022-08-24 10:20:27 +08:00
java 的泛型就是给编译器看看的语法糖,用着是真别扭,和 C#的泛型差距不是一般的大
cheng6563
2022-08-24 10:29:29 +08:00
为了兼容性泛型擦除完全是扯淡,Java 很多地方都感觉脑子有坑才这样设计的。
Ev1s
2022-08-24 10:33:24 +08:00
现在感觉 C#有些设计真的是不错
ghost024
2022-08-24 10:40:22 +08:00
@cheng6563 我看书上说是为了让非泛型代码的老库和泛型代码的新库能够更好地工作才弄得类型擦除。。。。
aotuman233
2022-08-24 10:48:30 +08:00
@ghost024 java 不还是有一堆 vector 和 hashtable 这种弃用的库。。。当时要是完全添加范型然后写一套新库也不会像现在这样这么多历史包袱
camliar
2022-08-24 11:00:53 +08:00
可以看看 R 大之前在知乎上面的回答 https://www.zhihu.com/question/28665443/answer/118148143
WispZhan
2022-08-24 11:12:06 +08:00
也可以看看这个: https://www.zhihu.com/question/34621277

如果是主 JVM 生态的,可以看看多看看 JEP
ghost024
2022-08-24 11:19:05 +08:00
@camliar
@WispZhan
多谢两位,我学习一下
a33291
2022-08-24 11:19:10 +08:00
C#支持泛型后,BCL 的库也提供了一套泛型实现(均在 System.Collections.Generic 命名空间下),比如 List<T>,没有泛型之前就是 ArrayList,现在这些泛型和非泛型都保留了下来能够同时使用.

向前兼容来说,1 个是不重新编译的情况下的兼容,一个是重新编译兼容.据我所知.net 应该是这 2 点都满足(注意现在有个 netcore 和 netframwork,这 2 个之间有一些割裂,具体不展开)

java 了解不多,貌似即使实现为擦除好像也不是很影响?因为你在写代码的时候 IDE 和编译器保证你类型安全,至于编译后在 runtime 有什么魔法,普通人管他呢?

只从实现角度来看的话,真泛型应该还是会复杂很多.
TWorldIsNButThis
2022-08-24 11:24:53 +08:00
c#新写了一套集合库
java 在出泛型之前已经有大量历史代码
为了实现和之前没加泛型的代码兼容所以用了擦除
aguesuka
2022-08-24 11:26:33 +08:00
Java 垃圾, 模式匹配不支持泛型就是个残疾
nothingistrue
2022-08-24 11:30:42 +08:00
.NET 到现在都经过好几次近乎重做了,经典的 .NET 4 跟 .NET 3.5 不兼容还没过去多久呢,这可不只是源代码不兼容,连运行时都不兼容。.NET 的向后兼容性,是跟 Windows 学习的,它本质上是多版本同时集成。这是要背靠 Windows Update 和微软下载中心,以及 Windows 的 dll 体系的。

Java 没有这么大的靠山,就只能单版本硬兼容。这条路,以后的.NET Core 可能也要走。
beginor
2022-08-24 12:22:14 +08:00
Java 所谓的范型就是把所有的东西都转成 Object , 而不是真正的运行时范型。
wanguorui123
2022-08-24 12:27:12 +08:00
C# 的范型比较完善可以实现很多高级功能,JAVA 的范型比较残废
voidmnwzp
2022-08-24 12:44:07 +08:00
Java 的假闭包 直接 copy 变量值类型 而非指针 导致强行限制只能用 nt 一样的 final 变量
假泛型 倒是乏善可陈 勉强能用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/874974

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX