【问题标题】:Sonar rule to catch raw collection types捕获原始集合类型的声纳规则
【发布时间】:2013-06-05 13:47:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: java sonarqube checkstyle pmd


    【解决方案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 对象的类型错误,并且永远不能添加到类型化的 myListcollection。

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

    【讨论】:

    • 接受了这个答案,因为看起来声纳中没有任何东西可以开箱即用。
    【解决方案2】:

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

    Bad practice - Unchecked type in generic call
    

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

    存储库:查找错误

    键:GC_UNCHECKED_TYPE_IN_GENERIC_CALL

    【讨论】:

    • 我启用了这个,但它不会触发 ArrayList foo= new ArrayList(); 形式的代码
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 2013-04-30
      • 1970-01-01
      • 2013-01-26
      相关资源
      最近更新 更多