我最近将sonar引入了一个大型遗留项目,最初是用java 1.3编写的。
我们一直在使用原始集合等来逐步迁移代码以使用泛型。追踪我们在声纳中的进展会很好,但似乎没有一个开箱即用的规则来捕捉原始集合的使用。
是否有现有的解决方案,还是需要在pmd / checkstyle中创建自定义规则?
答案 0 :(得分:1)
我一直在寻找同样的东西,因为我希望我们的声纳能够抓住它:
List myList = new ArrayList();
丹尼斯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
集合中。
从我看到的情况来看,似乎你必须建立一个自定义规则。
答案 1 :(得分:0)
这是你要找的规则吗?
Bad practice - Unchecked type in generic call
这种对泛型集合方法的调用在编译类型Object时传递参数,其中期望泛型类型参数中的特定类型。因此,标准Java类型系统和静态分析都不能提供有关作为参数传递的对象是否属于适当类型的有用信息。
存储库:findbugs
键:GC_UNCHECKED_TYPE_IN_GENERIC_CALL
答案 2 :(得分:0)
Hm,GC_UNCHECKED_TYPE_IN_GENERIC_CALL现已弃用,建议的替换S2175仅检查是否调用了某些Object类型的方法(即remove(Object))。
因此,似乎GC_UNCHECKED_TYPE_IN_GENERIC_CALL和S2175都不会发出警告,例如&#34; HashMap x&#34;而不是&#34; HashMap x&#34;。
似乎很奇怪,似乎没有这个规则......