gpt4 book ai didi

java - 如何将通配符 (?) 转换为通用类型 T?

转载 作者:搜寻专家 更新时间:2023-11-01 02:40:20 26 4
gpt4 key购买 nike

我有一个静态方法,我想用它来加载类并在运行时实例化我的对象,但是当我编译时,我收到了这个警告:

warning: [unchecked] unchecked cast
T t = (T) ctor.newInstance();
required: T
found: CAP#1
where T is a type-variable:
T extends Object declared in method <T>forName(String,Set<String>)
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?
1 warning

代码如下:

public static <T> Set<T> forName(String modulePath, Set<String> classes) throws InvalidModuleException{
try {
ClassLoader cl = new URLClassLoader(new URL[]{new URL(modulePath)});

Set<T> list = new HashSet<>(classes.size());
for (String className : classes) {
Class<?> clazz = (Class<?>) Class.forName(className, true, cl);
Constructor<?> ctor = clazz.getConstructor();
T t = (T) ctor.newInstance();
list.add(t);
}
return list;
} catch (MalformedURLException | ReflectiveOperationException ex) {
throw new InvalidModuleException(ex.getMessage());
}
}

谁能给我解释一下?

[更新]这是方法调用的示例:

HashSet<String> set = new HashSet<>();
h.add("fully_classfied_classname_readed_from_file"); //Class that extends AbstractApplication
Set<AbstractApplication> abs = Apps.forName("plugins/module.jar", set);

最佳答案

您不能以安全的方式使用字符串来指示类来做到这一点。一方面,编译器无法知道字符串集实际上包含完全限定的类名;即使它们是类名,也不能保证名称指定的类是 T 的子类。

不是传递一组字符串,而是传递一组类,限制为 T 的子类:

Set<Class<? extends T>> classes

然后您可以迭代这些类,并消除对任何强制转换的需要:

for (Class<? extends T> clazz : classes) {
Constructor<? extends T> ctor = clazz.getConstructor();
T t = ctor.newInstance();
list.add(t);
}

如果延迟类初始化的要求是绝对的,您别无选择,只能适本地向此方法添加 @SuppressWarnings,并希望加载这些字符串的配置是正确的。

关于java - 如何将通配符 (?) 转换为通用类型 T?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34766960/

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