Search code examples
javajava-5

When should I use the java 5 method cast of Class?


Looking through some code I came across the following code

trTuDocPackTypdBd.update(TrTuDocPackTypeDto.class.cast(packDto));

and I'd like to know if casting this way has any advantages over

trTuDocPackTypdBd.update((TrTuDocPackTypeDto)packDto);

I've asked the developer responsible and he said he used it because it was new (which doesn't seem like a particularly good reason to me), but I'm intrigued when I would want to use the method.


Solution

  • These statements are not identical. The cast method is a normal method invocation (invokevirtual JVM instruction) while the other is a language construct (checkcast instruction). In the case you show above, you should use the second form: (TrTuDocPackTypeDto) packDto

    The cast method is used in reflective programming with generics, when you have a Class instance for some variable type. You could use it like this:

    public <T> Set<T> find(Class<T> clz, Filter criteria) {
      List<?> raw = session.find(clz, criteria); /* A legacy, un-generic API. */
      Set<T> safe = new HashSet<T>();
      for (Object o : raw) 
        safe.add(clz.cast(o));
      return safe;
    }
    

    This gives you a safe way to avoid the incorrect alternative of simply casting a raw type to a generic type:

    /* DO NOT DO THIS! */
    List raw = new ArrayList();
    ...
    return (List<Widget>) raw;
    

    The compiler will warn you, Unchecked cast from List to List<Widget>, meaning that in the ellipsis, someone could have added a Gadget to the raw list, which will eventually cause a ClassCastException when the caller iterates over the returned list of (supposed) Widget instances.