升级应用程序以在Java中使用Generics有哪些注意事项?

时间:2011-06-14 13:37:55

标签: java generics

在使用Generics之前,我正在使用为Java 1.4编写的旧Java应用程序。从那时起,我们已经完成了对Java 6的升级。

我们现在正在考虑进行更改以支持我们的集合中的泛型,以便进行编译时类型安全检查,并保持开发人员的理智。

在执行此升级时,我们应该注意哪些警告或陷阱?

3 个答案:

答案 0 :(得分:6)

  1. 了解Java泛型的工作原理及其局限性。
  2. 使用具有良好重构支持的IDE。
  3. 慢慢小心地做。
  4. 首先做简单的事情,不要在创建复杂的泛型类之前等等,直到你知道它们确实是必需的。
  5. 抵制添加@SuppressWarning("unchecked")以诱使警告消失的诱惑。
  6. 这里没什么特别深刻的......

答案 1 :(得分:1)

升级最重要的部分,恕我直言,是为了确保开发它的开发人员对泛型有深入的了解,特别是关于将集合传递给函数并从函数中返回它们,如List<Animal> <> List<Tiger>即使您使用的是通用对象,您应该始终能够输入泛型。占位符。

使转换顺利/不顺利的另一件事是代码相关的,你有包含单一类型的集合,没有混合对象强制?或对象'全能'。这可能相当普遍,特别是对于地图。

如果使用任何底层库,Hibernate等,如果底层库不支持泛型,则可能会遇到限制。在这种情况下,您要么必须泄漏库代码,要么包装对象(不推荐)。

更改有意义的碎片,留下不合理的碎片,并分阶段进行,以便在遇到问题时始终可以回滚一块。

答案 2 :(得分:1)

斯蒂芬已经死了,但我会补充几点提示。

1)由于泛型是编译时间,因此它们在会话中反射和存储对象等几个地方是无用的(如果这是一个Web项目)。我不知道有什么干净的方法可以解决这个问题。我建议只需将<?>中的任何内容声明为只需处理类型检查。

2)这是过去烧伤我的那个。在方法定义中,使用List<? extends Shape>而不是List<Shape>。如果您的Circle类型属于Shape的孩子,那么List<Circle>无法传递到List<Shape>,但可以将其传递到List<? extends Shape> 。这似乎很小,但对我来说,它突然出现,需要对我认为已完成的课程进行大量额外更改。

3)我认为您不需要抑制泛型警告,因为您始终可以将List转换为List<?>并删除它们。但是我建议你不要这样做,除非那部分代码不能使用泛型(参见我的第一点)。最好有你计划修复的警告然后你计划改进的坏修复,因为你可能永远不会改进它们,而且每次你​​看项目时警告都会盯着你。