作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想使用其名称创建指定类的实例。我的代码如下所示。
我收到编译器警告。我这样做对吗?甚至可以使用类的名称并获取该类型的实例,因为我认为编译器无法知道该类型应该是什么?
public static <T> T create(final String className) {
try {
final Class<?> clazz = Class.forName(className);
//WARNING: Type safety: Unchecked cast from capture#2-of ? to T
return (T) create(clazz);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static <T> T create(final Class<T> classToCreate) {
final Constructor<T> constructor;
try {
constructor = classToCreate.getDeclaredConstructor();
final T result = constructor.newInstance();
return result;
}
catch (Exception e) {
e.printStackTrace();
}
}
谢谢
最佳答案
我认为第一种方法应该是这样的:
public static <T> T create(final String className, Class<T> ifaceClass)
throws ClassNotFoundException {
final Class<T> clazz = Class.forName(className).asSubclass(ifaceClass);
return create(clazz);
}
如果没有那些讨厌的类型安全警告,你不能使用类型参数进行向上类型转换。
顺便说一下,如果你忽略这些警告,create 方法可能会创建一个与调用者使用的实际类型不兼容的类的实例。这很可能会导致稍后出现意外的ClassCastException
;例如分配实例时。
编辑:@Pascal 指出我们需要添加一个类型转换来进行编译;即
Class<T> clazz = (Class<T>) Class.forName(className).asSubclass(ifaceClass);
很遗憾,我们还需要添加一个@SuppressWarnings
注解。
关于java - 泛型和 Class.forName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1733799/
我是一名优秀的程序员,十分优秀!