SonarQube java.lang.ClassCastException:Parametrize

2019-09-29 01:53发布

我努力使自己的SonarQube规则,该规则的目的是检查,我不使用含有对特定对象的收集方法。 例如用整数对象:

    List<Integer> a = new ArrayList<>();
    a.contains(1); // Noncompliant

要做到这一点,我试图让ParametrizedTypeJavaType。 然后,我就可以测试,如果它是一个整数或不...

    @Override
public void visitNode(Tree tree) {
    MethodInvocationTree methodInvocationTree = (MethodInvocationTree) tree;
    ExpressionTree expressionTree = ((MethodInvocationTree) tree).methodSelect();
    if(expressionTree.is(Kind.MEMBER_SELECT)){
        MemberSelectExpressionTree memberSelectExpressionTree = (MemberSelectExpressionTree) expressionTree;
        Type type = memberSelectExpressionTree.expression().symbolType();
        ParametrizedTypeJavaType parametrizedTypeJavaType = (ParametrizedTypeJavaType) type;
        // SOME CODE Test if it is an integer or not ...
        reportIssue(tree,"REPORT !");

    }


}

@Override
public List<Kind> nodesToVisit() {
    List<Kind> kinds = new ArrayList<>();
    kinds.add(Kind.METHOD_INVOCATION);
    return kinds;
}

}

这似乎JUnit测试过程中很好地工作,但是当我在我的测试项目推出蔡司镜头,扫描仪,我得到了以下错误:

Caused by: java.lang.ClassCastException: org.sonar.java.resolve.ParametrizedTypeJavaType cannot be cast to org.sonar.java.resolve.ParametrizedTypeJavaType
    at org.sonar.samples.java.checks.CollectionCheck.visitNode(CollectionCheck.java:38)

我做了一些研究,我碰到这个问题,这也将是我的问题来了:

Sonarqube错误java.lang.ClassCastException:org.sonar.java.resolve.SemanticModel不能转换为org.sonar.java.resolve.SemanticModel

我也遇到了这个规则,它看起来非常相似,我的规则,并使用ParametrizedTypeJavaType。

https://github.com/SonarSource/sonar-java/blob/master/java-checks/src/main/java/org/sonar/java/checks/CollectionInappropriateCallsCheck.java

因此,我完全糊涂了。 什么是好办法来处理我的问题呢?

SonarQube版本:6.3.1

谢谢你的帮助。

Answer 1:

ParametrizedTypeJavaType不是Java API的自定义规则的一部分。 而作为今天的语义API不会允许你访问泛型信息:这是计划但尚未安排: https://jira.sonarsource.com/browse/SONARJAVA-1871

你想达到什么更好的方法是依靠对现有的规则: https://sonarqube.com/coding_rules#rule_key=squid%3AS2175

如果这个规则不适合您正常工作,你能解释一下为什么?



文章来源: SonarQube java.lang.ClassCastException: ParametrizedTypeJavaType cannot be cast to ParametrizedTypeJavaType