【问题标题】:Question about java generics关于java泛型的问题
【发布时间】:2011-05-11 04:43:49
【问题描述】:

我正在编写这个查询服务,它假设可以使用几个预定义的类。然而,在我看来,在使用这个服务类时,我需要传递类的类型和它自己的类对象,这似乎是多余的。例如,要查询“Contact”对象,我需要同时提供 Contact.class 和 Contact.class,如下所示:

lookupService = new MyLookupServiceImpl<Contact>(Contact.class);

在这种情况下,有没有办法在不传入“Contact.class”的情况下初始化Class? 服务类如下所示:

public class MyLookupServiceImpl<T> {
private Class<T> cls;

public MyLookupServiceImpl(Class<T> clz){
    this.cls = clz;
}

public T queryObject(String sql) {
    try {
        QueryResult result = ConnectionFactory.getConnection().query(sql);
        if(result.getSize()>0){
            T obj=null;
            MyObject sObj = result.getRecords()[0];
            MyObjectBuilder<T> ob = new MyObjectBuilder<T>(cls);
            obj = ob.buildORMObject(sObj);
            return obj;
        }
    } catch (ConnectionException e) {
        logger.warn(e.toString());
    }
    return null;
}
}

任何建议都将不胜感激。

谢谢,

【问题讨论】:

    标签: java generics reflection


    【解决方案1】:

    答案是否定的。在 java 中,由于 type erasure,除了将类型信息作为 Class&lt;?&gt; 实例传递之外,没有其他方法可以在运行时推断/获取此信息。

    【讨论】:

      【解决方案2】:

      这很可能是必要的,因为不可能创建由类型参数指示的任意类的新实例;换句话说,你不能这样做:

      T obj = new T();
      

      因为 Java 泛型的实现方式(类型擦除)。

      请注意,在您的代码中,cls 被传递给 MyObjectBuilder&lt;T&gt;,这很可能是一个创建 T 新实例的对象。 MyObjectBuilder&lt;T&gt; 使用反射创建T 的新实例,语句如下:

      T obj = cls.newInstance();
      

      另请参阅:Create new instance of T in Java

      【讨论】:

        【解决方案3】:

        不幸的是,Bala 是正确的 (+1)。但是,如果您使用像 Guice 这样的依赖注入框架,您可以要求 Guice 将您感兴趣的类型传递给您。您可以执行以下操作:

        public class MyLookupServiceImpl<T> {
            private Class<T> cls;
        
            @Inject
            public MyLookupServiceImpl(TypeLiteral<T> type){
                this.cls = (Class<T>)type.getRawType();
            }
        }
        

        然后使用 Guice Injector 向您传递 MyLookupServiceImpl 的实例。只是一个想法! :)

        【讨论】:

          猜你喜欢
          • 2023-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-04
          相关资源
          最近更新 更多