为什么有些人声称Java的泛型实现很糟糕?

2022-08-31 08:33:10

我偶尔会听说,对于泛型,Java并没有做对。(最近的参考,在这里)

原谅我缺乏经验,但什么会让他们变得更好呢?


答案 1

坏:

  • 类型信息在编译时丢失,因此在执行时您无法分辨它的“含义”是什么类型
  • 不能用于值类型(这是一个大问题 - 例如,在.NET中,a确实由a支持,并且不需要装箱)List<byte>byte[]
  • 用于调用泛型方法的语法很糟糕 (IMO)
  • 约束的语法可能会令人困惑
  • 通配符通常令人困惑
  • 由于上述原因造成的各种限制 - 铸造等

好:

  • 通配符允许在调用端指定协方差/逆方差,这在许多情况下非常整洁
  • 总比没有好!

答案 2

最大的问题是Java泛型只是编译时的东西,你可以在运行时颠覆它。C#受到称赞,因为它执行了更多的运行时检查。这篇文章中有一些非常好的讨论,它链接到其他讨论。


推荐