Vla*_*yin 1 java generics casting
我想编写通用函数,它可以通过名称创建任何类型的对象并将其作为自己的类型返回,而不是作为对象类型。
import java.lang.reflect.Constructor;
public class Test{
static <T extends Object> T makeObject(String className) {
try {
Class<?> c = Class.forName(className);
Constructor<?> constructor = c.getConstructor();
Object object = constructor.newInstance();
return (T)c.cast(object);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
//without casting
String obj = makeObject("java.lang.String");
System.out.println(obj.getClass());
}
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我收到警告
Type safety: Unchecked cast from capture#4-of ? to T
Run Code Online (Sandbox Code Playgroud)
如何在不添加的情况下解决问题@SuppressWarnings("unchecked")?
如果您希望这是安全的,您需要将类作为参数传递,否则您将无法获得想要的东西。您的代码将编译我要求的返回类型,但如果类型不兼容,则会在运行时失败。
试试看:
String s = makeObject("java.lang.String"); // compiles and runs
Integer i = makeObject("java.lang.String"); // compiles but fails at runtime with java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
Run Code Online (Sandbox Code Playgroud)
一个安全的版本看起来像这样
static <T> T makeObject(Class<T> clazz) throws Exception {
return clazz.getConstructor().newInstance();
}
Run Code Online (Sandbox Code Playgroud)
但这表明您已经知道您想要什么类型,而不仅仅是从文件或其他东西中获取类名。
| 归档时间: |
|
| 查看次数: |
287 次 |
| 最近记录: |