gpt4 book ai didi

java - 类型转换一个泛型类。 (种姓)和 Class.cast()

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:58:15 24 4
gpt4 key购买 nike

我搜索了我的用例并找到了一些有趣的答案,但它们并不像我需要的那样合适。这样做的适当方法是什么:

@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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com