2011-05-10 125 views
4

我正在写这个查询服务,它假设可以使用几个预定义的类。然而,在使用这个服务类时,我觉得这是多余的,我需要传递类的类型和它自己的一个类对象。例如,查询“联系”的对象,我需要同时提供和Contact.class,如下所示:关于java泛型的问题

lookupService = new MyLookupServiceImpl<Contact>(Contact.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; 
} 
} 

任何建议,将不胜感激。

谢谢,

回答

3

答案是否定的。在java中,由于type erasure,在运行时没有其他方式推断/获取此信息,并将类型信息作为Class<?>实例传递。

0

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

T obj = new T(); 

由于Java泛型实现(类型擦除)的方式。

请注意,在您的代码中,cls传递给MyObjectBuilder<T>,这很可能是创建T的新实例的对象。 MyObjectBuilder<T>使用反射来创建的T一个新实例,用这样的语句:

T obj = cls.newInstance(); 

参见:Create new instance of T in Java

0

巴拉是正确的(+1)很可惜。但是,如果使用依赖注入框架像Guice,你可以问吉斯传给你一个TypeLiteral这是你感兴趣的类型,你可以做这样的事情:

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

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

然后使用吉斯注射器来传递MyLookupServiceImpl的实例。只是一个想法! :)