【问题标题】:Java Generics + Class name in String formatJava 泛型 + 字符串格式的类名
【发布时间】: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&lt;List&lt;Object&gt;&gt; 应该可以满足您的目的,尽管不是类型安全的。
  • @RohitJain 所指的是类型擦除。看这个链接:Type Erasure
  • 我不确定类型擦除是否是一个问题。 query.getResultMapperClass() 返回 exactly 什么,错误信息 exactly 是什么?无论如何,电话应该是new BeanListHandler&lt;...&gt;(classObj) (没有.class)。
  • 也许保证类实现了给定的接口IFoo。然后有Class&lt;? extends IFoo&gt; classObj = ...。然后你可以做ResultSetHandler&lt;List&lt;? extends IFoo&gt;&gt; h = new BeanListHandler&lt;List&lt;? extends IFoo&gt;&gt;(classObj);。让IFoo 包含您期望的类中存在的所有方法。

标签: java generics apache-commons-dbutils


【解决方案1】:

硬编码类型还不错。它们是泛型的本质。泛型的目的是在compile time 提供更好的类型检查。如果您想将ResultSetHandler 与不同类型的列表一起使用,请考虑使用这些类型的公共基类或接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 2018-08-08
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2014-10-18
    • 2017-07-17
    • 1970-01-01
    相关资源
    最近更新 更多