在使用Generics之前,我正在使用为Java 1.4编写的旧Java应用程序。从那时起,我们已经完成了对Java 6的升级。
我们现在正在考虑进行更改以支持我们的集合中的泛型,以便进行编译时类型安全检查,并保持开发人员的理智。
在执行此升级时,我们应该注意哪些警告或陷阱?
答案 0 :(得分:6)
@SuppressWarning("unchecked")
以诱使警告消失的诱惑。这里没什么特别深刻的......
答案 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<?>
并删除它们。但是我建议你不要这样做,除非那部分代码不能使用泛型(参见我的第一点)。最好有你计划修复的警告然后你计划改进的坏修复,因为你可能永远不会改进它们,而且每次你看项目时警告都会盯着你。