gpt4 book ai didi

java - 将泛型参数绑定(bind)到 Class 时未经检查的强制转换

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

我有一些代码需要一个外部提供的类名,并且需要构造一个实现某个接口(interface)的实例,我们称之为Foo

作为这个过程的一部分,我希望有以下功能:

private static Class<? extends Foo> fooFromClassName(String name) throws ClassNotFoundException {
return (Class<? extends Foo>) Class.forName(name);
}

这显然会导致未经检查的警告,因为它确实不安全 - 据我们所知,调用者可能请求了“java.lang.Long”。我最终希望这种方法能够保证如果它不抛出,则返回的 Class 代表一个 Foo 实现。

我目前最好的解决方案是这样的:

private static Class<? extends Foo> fooFromClassName(String name) throws ClassNotFoundException {
Class<?> impl = Class.forName(name);
if (Foo.class.isAssignableFrom(impl)) {
@SuppressWarnings("unchecked")
Class<? extends Foo> foo = (Class<? extends Foo>) impl;
return foo;
} else {
// Throw something - ClassCastException perhaps.
}
}

有更好的方法吗?有什么方法不需要明确禁止警告吗?

最佳答案

Class.asSubclass :

private static Class<? extends Foo> fooFromClassName(String name) throws ... {
return Class.forName(name).asSubclass(Foo.class);
}

如果请求的类不是 Foo 的子类(或 Foo 本身),您将得到一个 ClassCastException。换句话说,它的作用与您的解决方案几乎相同。

关于java - 将泛型参数绑定(bind)到 Class<?> 时未经检查的强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12523071/

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