【发布时间】:2013-06-05 13:47:52
【问题描述】:
我最近将声纳引入了一个大型遗留项目,最初是用 java 1.3 编写的。
我们一直在逐步将使用原始集合等的代码迁移到使用泛型。跟踪我们在声纳方面的进展会很好,但似乎没有开箱即用的规则来捕捉原始集合的使用。
是否有现有的解决方案,或者我需要在 pmd/checkstyle 中创建自定义规则?
【问题讨论】:
标签: java sonarqube checkstyle pmd
我最近将声纳引入了一个大型遗留项目,最初是用 java 1.3 编写的。
我们一直在逐步将使用原始集合等的代码迁移到使用泛型。跟踪我们在声纳方面的进展会很好,但似乎没有开箱即用的规则来捕捉原始集合的使用。
是否有现有的解决方案,或者我需要在 pmd/checkstyle 中创建自定义规则?
【问题讨论】:
标签: java sonarqube checkstyle pmd
我也在寻找同样的东西,因为我希望我们的声纳也能捕捉到这个:
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 对象的类型错误,并且永远不能添加到类型化的 myListcollection。
据我所见,您似乎必须建立一个自定义规则。
【讨论】:
这是您正在寻找的规则吗?
Bad practice - Unchecked type in generic call
此对泛型集合方法的调用在编译类型 Object 时传递一个参数,其中需要来自泛型类型参数的特定类型。因此,标准的 Java 类型系统和静态分析都不能提供关于作为参数传递的对象是否属于适当类型的有用信息。
存储库:查找错误
键:GC_UNCHECKED_TYPE_IN_GENERIC_CALL
【讨论】:
嗯,现在不推荐使用 GC_UNCHECKED_TYPE_IN_GENERIC_CALL,建议的替换 S2175 仅检查是否调用了某些对象类型的方法(即 remove(Object))。
因此,GC_UNCHECKED_TYPE_IN_GENERIC_CALL 和 S2175 似乎都不会针对“HashMap x”而不是“HashMap x”发出警告。
这似乎没有规则,这似乎很奇怪......
【讨论】: