【发布时间】:2016-03-08 06:47:49
【问题描述】:
我搜索了我的用例并找到了一些有趣的答案,但它们并不像我需要的那样合适。这样做的适当方法是什么:
@SuppressWarnings("unchecked")
public <T> T newInstance(String name) throws ClassCastException, InstantiationException, IllegalAccessException, ClassNotFoundException {
return (T) loadClass(name).newInstance();
}
或有点不同:
public <T> T newInstance(String name, Class<T> c) throws ClassCastException, InstantiationException, IllegalAccessException, ClassNotFoundException {
return c.cast(loadClass(name).newInstance());
}
我认为这两种方法都是一样的。从我的角度来看,方法1更好,因为参数更少。两者都抛出ClassCastException,这对我来说很好。确实,@SuppressWarnings("unchecked") 注释不好。
谁能告诉我一种方法相对于另一种方法是否有任何优势?
编辑:Jon Skeet's answer 是正确的。下面的 sn-p 可以提供额外的说明。
public class Test {
public static void main(String[] args) {
Object o = new Object();
// Exception at c.cast(o)
Test.<String>realCast(o, String.class);
}
private static <T> T realCast(Object o, Class<T> c) {
return c.cast(o);
}
}
当o 无法转换为c 时,使用realCast() 会产生异常。相比之下,fakeCast() 只承诺该方法的结果是T 的类型。
【问题讨论】: