繁体   English   中英

Java通用类型,具有extends和使用Hibernate的T

[英]Java Generic Type with extends and T using Hibernate

我有一个像这样的简单界面。

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

和一堂课

public Student implements EntityClass

我正在尝试编写一个使用通用类型T的类,但仍然是EntityClass a EntityClass subclass实例,而a 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)

或我如何完成我的愿望代码..任何工作方法。

因为一个烦人的传递作为参数。

UPDATE

我想做的就是传递EntityClass的SubClass并创建。

session.createCriteria(genericType);

也给我列表,但我不知道是否有可能通过通用类型传递CustomizableQueriesForClazzAndFields<Student>并传递给of()方法,该方法创建了org.hibernate.Criteria object我不能仅传递T值因为在我的图中,我希望成为EntityClass的子类,而不仅仅是raw T value.

我需要捕捉或捕捉

CustomizableQueriesForClazzAndFields<Student> 

Student generic type.

如果可能的话,或者我梦见我的英语不好对不起。

非常感谢委内瑞拉的问候。

方法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");

方法二:

除了传递Class<T>作为参数之外,您还可以为每个T创建子类,例如, class StudentQueries extends CustomizableQueriesForClazzAndFields<Student> ,然后使用反射来找出T的类型。 不过请注意,这仅适用于定义T的具体类型的子容器。

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

更新 :如果要实现第二种方法(子类),请在此处查看有关如何使用反射查找T类型的代码: http : //www.artima.com/weblogs/viewpost.jsp?thread = 208860

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM