Martijn Burger
Martijn Burger

Reputation: 7543

Why cast a String to a String?

An article on the Oracle Java Community sites gives as an example (for a JPA Converter, but that's not relevant, I guess) the following method:

public Boolean convertToEntityAttribute(String y) {
    String val = (String) y;
    if(val.equals("Y")){
        return true;
    } else {
        return false;
    }
}

What is the use of casting the String y to a String val? Is there a valid reason to do this?

Original article: What's New in JPA

Upvotes: 5

Views: 375

Answers (3)

Stephen C
Stephen C

Reputation: 719576

Is there a valid reason to do this?

None whatsoever1.

But the flipside is that the Java compiler knows that the typecast is unnecessary and optimizes it away. So the only "damage" is to readability.

For example.

[stephen@blackbox tmp]$ cat Test.java 
public class Test {
    public void test (String x) {
        String s = (String) x;
        System.out.println(s);
    }
}
[stephen@blackbox tmp]$ javac Test.java 
[stephen@blackbox tmp]$ javap -c Test
Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public void test(java.lang.String);
    Code:
       0: aload_1
       1: astore_2
       2: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       5: aload_2
       6: invokevirtual #3                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       9: return
}
[stephen@blackbox tmp]$ 

The statement String s = (String) x; is compiled to a simple load and a store; no checkcast instruction.

I wouldn't be surprised if the JIT compiler was capable of optimizing away a redundant checkcast ... if it saw one.


1 - ... in hand written code. In source code that was generated, a redundant typecast could be serve the purpose of making it easier to write the source code generator. After all, the readability of generated code is largely irrelevant.

Upvotes: 4

Ruchira Gayan Ranaweera
Ruchira Gayan Ranaweera

Reputation: 35587

This redundant casting is useless.

Current code can be simplify to

public Boolean convertToEntityAttribute(String y) {
    return "Y".equals(y);
}

Upvotes: 2

Tagir Valeev
Tagir Valeev

Reputation: 100309

Such cast is completely unnecessary. I can imagine that it was before

public Boolean convertToEntityAttribute(Object y) {
    String val = (String) y;
    ...
}

But later the argument type was changed to String and the author simply forgot to remove the cast.

Upvotes: 13

Related Questions