[英]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.