簡體   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