【发布时间】:2015-03-12 09:41:17
【问题描述】:
下面运行正常:
ResultSetHandler<List<MyClass>> h = new BeanListHandler<MyClass>(MyClass.class);
问题是MyClass 是硬编码的。上一行位于集中位置,因此硬编码不好。
我有 MyClass 的完全限定类名,即 com.company.vo.MyClass
现在我想通过将传入的字符串转换为实际的类来生成上面的ResultSetHandler。
请帮忙,我试过了:
Class<?> classObj = Class.forName("com.company.vo.MyClass");
ResultSetHandler<List<classObj>> h = new BeanListHandler<classObj>(classObj.class);
哪个抛出:
classObj cannot be resolved to a type
感谢阅读。
【问题讨论】:
-
你不能那样做。泛型在运行时没有业务。您必须在编译时知道类名。
-
正如 Rohit Jain 指出的那样,这是不可能的。编译器需要在编译时知道确切的类。替代方案:
ResultSetHandler<List<Object>>应该可以满足您的目的,尽管不是类型安全的。 -
@RohitJain 所指的是类型擦除。看这个链接:Type Erasure
-
我不确定类型擦除是否是一个问题。
query.getResultMapperClass()返回 exactly 什么,错误信息 exactly 是什么?无论如何,电话应该是new BeanListHandler<...>(classObj)(没有.class)。 -
也许保证类实现了给定的接口
IFoo。然后有Class<? extends IFoo> classObj = ...。然后你可以做ResultSetHandler<List<? extends IFoo>> h = new BeanListHandler<List<? extends IFoo>>(classObj);。让IFoo包含您期望的类中存在的所有方法。
标签: java generics apache-commons-dbutils