2

我最近将声纳引入了一个大型遗留项目,该项目最初是用 java 1.3 编写的。

我们一直在逐步使用原始集合等迁移代码以使用泛型。跟踪我们在声纳方面的进展会很好,但似乎没有一个开箱即用的规则来捕捉原始集合的使用。

是否有现有的解决方案,或者我需要在 pmd/checkstyle 中创建自定义规则?

4

3 回答 3

1

我一直在寻找同样的东西,因为我希望我们的声纳也能捕捉到这个:

List myList = new ArrayList();

Dennis S 提到的规则不适用,因为它旨在捕捉以下情况(根据http://coding.tocea.com/java/gc_unchecked_type_in_generic_call/

StringBuilder myText = new StringBuilder();
...
List<String> myList = new ArrayList<String>();
boolean containsMyText = myList.contains(someText);

代码可以编译,因为该collection.contains()方法采用 Object 参数,即使对于类型化集合也是如此。但这是一个无关紧要的检查,并且总是返回 false,因为myText对象的类型错误并且永远不能添加到类型化myList集合中。

从我所见,您似乎必须建立一个自定义规则。

于 2013-10-01T08:54:07.513 回答
0

这是您正在寻找的规则吗?

Bad practice - Unchecked type in generic call

这个对泛型集合方法的调用在编译类型 Object 时传递一个参数,其中需要来自泛型类型参数的特定类型。因此,标准 Java 类型系统和静态分析都不能提供关于作为参数传递的对象是否属于适当类型的有用信息。

存储库:findbugs

键:GC_UNCHECKED_TYPE_IN_GENERIC_CALL

于 2013-06-05T14:07:53.633 回答
0

嗯,现在不推荐使用 GC_UNCHECKED_TYPE_IN_GENERIC_CALL,建议替换,S2175 只检查是否调用了某些对象类型的方法(即 remove(Object))。

因此,似乎 GC_UNCHECKED_TYPE_IN_GENERIC_CALL 和 S2175 都不会针对“HashMap x”而不是“HashMap x”发出警告。

似乎很奇怪,这似乎没有规则......

于 2016-06-06T23:36:10.977 回答