2015-03-02 24 views
0

我有一个这样的简单的界面。Java通用类型与扩展和T使用休眠

public interface EntityClass 
{  
    public void setId(final Integer id);  
    public Integer getId();  
} 

和一类

public Student implements EntityClass 

我想代码使用泛型类型T一类,但仍然是一个的instanceof EntityClassa EntityClass subclass这样的事情。

public abstract class CustomizableQueriesForClazzAndFields<T extends EntityClass> 

这是该类中的项目,我想要一个像这样的方法。

public List<T>getMultipleClazzWithFields(final String ...fields){return of(genericType).retrieve(fields);} 

private MyCriteria of(final Class<? extends EntityClass>applyToClazz){........} 

MyCriteria是org.hibernate.Criteria的包装。

而在我的实现会做这样的事情。

public final class TestCustom extends CustomizableQueriesForClazzAndFields<Student> 
{ 
    public static void main(String[] args) 
    { 
     final TestCustom clazz = new TestCustom(); 
     final List<Student>a=clazz.getMultipleClazzWithFields("id","name","phone"); 
     a.stream().forEach(clazz::consumer); 
    }  
} 

这样做代码我想是表示像这样使用泛型。

public List<Student>getMultipleClazzWithFields(final String ...fields){return of(Student.class).retrieve(fields);} 

但我不知道如何表示这个或如果它是可能的。

public List<T>getMultipleClazzWithFields(final String ...fields){return of(genericType).retrieve(fields);} 

哪些genericType应该把它表示Student相同Student

public final class TestCustom extends CustomizableQueriesForClazzAndFields<Student> 

,或者代表它作为

public final class TestCustom extends CustomizableQueriesForClazzAndFields<School> 

,并会做这样的事情

public List<School>getMultipleClazzWithFields(final String ...fields){return of(School.class).retrieve(fields);} 

因为我是这样潜水

public List<T>getMultipleClazzWithFields(final String ...fields){return of(T).retrieve(fields);} 

但编译器踢我说。

cannot find symbol 
symbol: variable T 
location: class CustomizableQueriesForClazzAndFields<T> 
where T is a type-variable: 
T extends EntityClass declared in class CustomizableQueriesForClazzAndFields 
---- 
(Alt-Enter shows hints) 

我也尝试

public abstract class CustomizableQueriesForClazzAndFields<Class<T extends EntityClass>> 

但是说。

> expected 
---- 
(Alt-Enter shows hints) 

或者我如何完成我的愿望代码..任何workaorund。

因为我是一种烦人的传递参数。

UPDATE

所有我想要做的是传递的EntityClass一个子类,并创建。

session.createCriteria(genericType); 

除了给我的名单,但我不知道是否有可能赶上或捕获泛型类型通CustomizableQueriesForClazzAndFields<Student>并传递给of()方法,它是谁,因为在创建org.hibernate.Criteria object我不能只传递一个T值我图想成为一个EntityClass不是一个子类只是一个raw T value.

我需要赶上或捕获

CustomizableQueriesForClazzAndFields<Student> 

Student generic type.

如果这可能或者我梦见我可怜的英语感到抱歉。

感谢了很多,从委内瑞拉的问候..

+0

我不,如果十分确定我得到你的问题在哪里,但为什么你使用'Class <?扩展EntityClass>'而不是简单地使用T?是否有可能给予更多的在线人作为你想要达到的目标? – wastl 2015-03-02 13:39:33

+0

pleasee我编辑的问题... – chiperortiz 2015-03-02 14:19:59

回答

1

方法1:

我不知道我完全理解你的问题,但我有一种感觉,你想是这样的:

public abstract class CustomizableQueriesForClazzAndFields<T extends EntityClass> { 
    public List<T> getMultipleClazzWithFields(final Class<T> clazz, final String ...fields){ 
    return of(clazz).retrieve(fields); 
    } 

    private MyCriteria of(final Class<T> applyToClazz) { 
    ... 
    } 
} 

编译器不能在运行时根据推断的数据创建/检索T的实例,因此您必须以某种方式传递该信息,例如作为一个参数:

List<Student> l = getMultipleClazzWithFields(Student.class, "field1", "field2"); 

方法2:

不是传递Class<T>作为参数,你也可以为每个T创建子类,例如中class StudentQueries extends CustomizableQueriesForClazzAndFields<Student>,然后使用反射来找出T的类型。请注意,这只适用于定义T的具体类型的子版本。

哪种方法更好取决于您的需求,但如果只是为了查询,我会将实体的类作为调用参数传递并跳过所有其他需要的子类。

更新:如果你要实现的第二个方法(子类)看看这里了解如何使用反射来查找的T类型的一些代码:http://www.artima.com/weblogs/viewpost.jsp?thread=208860

+0

我能够得到泛型类型。喜欢这个。私人决赛Class <?扩展EntityClass> clazzToBeApplied; public CustomizableQueriesForClazzAndFields(){clazzToBeApplied =(Class <?extends EntityClass>)((ParameterizedType)getClass()。getGenericSuperclass())。getActualTypeArguments()[0]; return;} 把它放在你的答案上,我会标记它如解决.. – chiperortiz 2015-03-02 14:57:51

+0

我遵循您的链接帖子,我解决了这个问题。使用检索泛型类。 clazzToBeApplied =(Class <?extends EntityClass>)((java.lang.reflect.ParameterizedType)getClass()。getGenericSuperclass())。getActualTypeArguments()[0];' – chiperortiz 2015-03-02 15:06:02