什么时候应该使用类的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
,当调用者遍历返回的列表(假设)时,最终会导致ClassCastException
) Widget
实例。
这样做的主要情况(IME)是您需要安全地转换为generics类/方法。 由于类型擦除,你不能转换为T
但是如果你已经提供了一个Class extends T>
Class extends T>
参数然后你可以使用它来转换,结果将可以赋值给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时使用强制转换方法,并且在这种情况下它看起来更好。 所有其他时间我发现自己使用第二种铸造方式。