Why is this an issue?

Casting expressions are utilized to convert one data type to another, such as transforming an integer into a string. This is especially crucial in strongly typed languages like C, C++, C#, Java, Python, and others.

However, there are instances where casting expressions are not needed. These include situations like:

These scenarios are considered unnecessary casting expressions. They can complicate the code and make it more difficult to understand, without offering any advantages.

As a result, it’s generally advised to avoid unnecessary casting expressions. Instead, rely on the language’s type system to ensure type safety and code clarity.

Exceptions

Casting may be required to distinguish the method to call in the case of overloading:

class A {}
class B extends A{}
class C {
  void fun(A a){}
  void fun(B b){}

  void foo() {
    B b = new B();
    fun(b);
    fun((A) b); // Compliant, required to call the first method so cast is not redundant.
  }
}

How to fix it

To fix your code remove the unnecessary casting expression.

Code examples

Noncompliant code example

class Example {
    public void example(List<String> list) {
        for (String item: (List<String>) list) {  // Noncompliant, Remove this unnecessary cast to "List".
          //...
        }
    }
}

Compliant solution

class Example {
    public void example() {
        for (String foo : getFoos()) {
          //...
        }
    }

    public List<String> getFoos() {
        return List.of("foo1", "foo2");
    }
}

Resources

Documentation