這些敘述不完全相同。該轉換方法是一種常規方法調用(invokevirtual
JVM指令),而另一種是語言結構(checkcast
指令)。在上面顯示的情況下,應該使用第二種形式:(TrTuDocPackTypeDto) packDto
cast
方法用於具有泛型的反射編程,當您對某些變量類型具有Class實例時。你可以使用這樣的:
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;
}
這給你一個安全的方式,以避免簡單地鑄造原始類型到一個通用的類型不正確的選擇:
/* DO NOT DO THIS! */
List raw = new ArrayList();
...
return (List<Widget>) raw;
編譯器會警告你,Unchecked cast from List to List<Widget>
,這意味着在省略號中,某人可能會在原始列表中添加Gadget
,當調用方迭代(應該)Widget
實例的返回列表時,最終會導致ClassCastException
。
另請參閱http://stackoverflow.com/questions/7900410/why-would-i-use-java-lang-class-cast/7902048#7902048 – irreputable 2011-10-26 11:52:34