- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我搜索了我的用例并找到了一些有趣的答案,但它们并不像我需要的那样合适。这样做的适当方法是什么:
@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是正确的。以下片段可以提供额外的说明。
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()
相比,它只 promise 该方法的结果是 T
的类型。
最佳答案
I think that both methods do the same.
不,他们没有。因为在执行时,第一段代码不知道 T
的类型由于type erasure .这意味着 Actor 在方法内基本上什么都不做。 调用 代码可能会隐式转换为任何 T
它是指定的,但如果调用者是另一个泛型方法(这里使用 T
作为另一个类型参数),即使那样也不需要。
这是一个简单的例子:
public class Test {
public static void main(String[] args) {
Object o = new Object();
// No exception
Test.<String>fakeCast(o);
// Exception at the point of assignment:
// the code is effectively String x = (String) ...;
String x = Test.<String>fakeCast(o);
}
private static <T> T fakeCast(Object o) {
return (T) o;
}
}
第二个代码知道 T
的类型形式为 Class<T>
,因此它可以在执行时执行真正的转换,恰好您正在执行它。
关于java - 类型转换一个泛型类。 (种姓)和 Class.cast(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35860805/
我搜索了我的用例并找到了一些有趣的答案,但它们并不像我需要的那样合适。这样做的适当方法是什么: @SuppressWarnings("unchecked") public T newInstance
我是一名优秀的程序员,十分优秀!