什么时候应该使用类的java 5方法?

浏览一些代码,我遇到了以下代码

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

而且我想知道这种方式是否有任何优势

 trTuDocPackTypdBd.update((TrTuDocPackTypeDto)packDto); 

我已经问开发人员负责了,他说他使用它是因为它是新的(这对我来说似乎不是一个特别好的理由),但是当我想要使用这种方法时我很感兴趣。

这些陈述并不相同。 cast方法是普通的方法调用( invokevirtual JVM指令),而另一种是语言构造( checkcast指令)。 在上面显示的情况下,您应该使用第二种forms: (TrTuDocPackTypeDto) packDto

当你有一个类变量类型的Class实例时, cast方法用于generics的reflection编程。 你可以像这样使用它:

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

这为您提供了一种安全的方法来避免将原始类型简单地转换为generics类型的错误替代方法:

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

编译器会警告你, Unchecked cast from List to List ,这意味着在省略号中,有人可能在原始列表中添加了一个Gadget ,当调用者遍历返回的列表(假设)时,最终会导致ClassCastExceptionWidget实例。

这样做的主要情况(IME)是您需要安全地转换为generics类/方法。 由于类型擦除,你不能转换为T但是如果你已经提供了一个Class Class参数然后你可以使用它来转换,结果将可以赋值给T类型的变量。

我找不到一个示例,其中cast方法是可能的,而铸造语法不是。 但是,查看代码时,似乎在无法进行强制转换的情况下,cast方法抛出一个没有附加类型信息的ClassCastException,而强制转换语法会给你一些提示(如“,”无法将Snoopy强制转换为TyrannosorusRex “):

 /** * Casts an object to the class or interface represented * by this Class object. * * @param obj the object to be cast * @return the object after casting, or null if obj is null * * @throws ClassCastException if the object is not * null and is not assignable to the type T. * * @since 1.5 */ public T cast(Object obj) { if (obj != null && !isInstance(obj)) throw new ClassCastException(); return (T) obj; } 

用第一种forms

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

你可以这样做:

 public void dynamicCast( Class clazz, Object o ) { this.x = clazz.cast( o ); } 

随着第二个你不能。 铸造类应该是硬编码的。

你为什么要在第一时间使用变量? 那是另一个问题。 :)首先想到的是,你不知道(在编译时)将被转换为的类。

这两个陈述都是相同的。 选择你认为更具可读性的那个。 第二种方法在我的经验中更常见,它是我喜欢的一次。

我倾向于仅在使用reflection时使用强制转换方法,并且在这种情况下它看起来更好。 所有其他时间我发现自己使用第二种铸造方式。