2015-03-02 53 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