生活随笔
收集整理的這篇文章主要介紹了
对Java泛型的简单理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
? 泛型的定義主要有以下兩種:
在程序編碼中一些包含類型參數的類型,也就是說泛型的參數只可以代表類,不能代表個別對象。(這是當今較常見的定義)
在程序編碼中一些包含參數的類。其參數可以代表類或對象等等。(現在人們大多把這稱作模板)
????????泛型的好處是在編譯的時候檢查類型安全,并且所有的強制轉換都是自動和隱式的,提高代碼的重用率。
泛型只不過是java中的類型而已,繼承自Type接口。
泛型的意義在于:在抽象的時候泛化,在具體的時候細化,在編譯的時候就可以決定泛化的值。通俗得講,可以將泛型看做是類或者接口帶了一個參數,這個參數可以在屬性、方法的參數、方法的返回值中使用使用。
ParameterizedType有如下幾個方法:
?
| ?Type[] | getActualTypeArguments()? ??????????返回表示此類型實際類型參數的?Type?對象的數組。 |
| ?Type | getOwnerType()? ??????????返回?Type?對象,表示此類型是其成員之一的類型。 |
| ?Type | getRawType()? ??????????返回?Type?對象,表示聲明此類型的類或接口。 |
actualTypeArguments指類的參數
rawType指帶了參數的類或者接口
了解這些之后,就可以對使用了Hibernate的Dao進行一次CRUD的重構。
import java.lang.reflect.ParameterizedType; import java.util.Collection; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.SessionFactory; /** ? * 超類dao實現,專門用于繼承 ? */ @SuppressWarnings ( "unchecked" ) public abstract class BaseDaoImpl<T> implements BaseDao<T> { ???? //注入會話工廠 ???? @Resource (name= "sessionFactory" ) ???? private SessionFactory sf ; ????? ???? private Class<T> clazz ; ???????? /** ????? * 1、this代表該類的子類 ????? * 2、this.getClass().getGenericSuperclass()代表該類 ????? * 3、type.getActualTypeArguments()[0]就是T ????? * 4、type.getRawType()就是BaseDaoImpl ????? */ ???????? public BaseDaoImpl(){ ???????? ParameterizedType type = (ParameterizedType) this .getClass().getGenericSuperclass(); ???????? clazz = (Class<T>) type.getActualTypeArguments()[ 0 ]; ???? } ???? public void saveEntity(T t) { ???????? sf.getCurrentSession().save(t); ???? } ???? public void updateEntity(T t) { ???????? sf.getCurrentSession().update(t); ???? } ???? public void saveOrUpdateEntity(T t) { ???????? sf.getCurrentSession().saveOrUpdate(t); ???? } ???? public void deleteEntity(T t) { ???????? sf.getCurrentSession().delete(t); ???? } ???? //批量更新 ???? public void batchEntityByHQL(String hql, Object... objects) { ???????? Query q = sf.getCurrentSession().createQuery(hql); ???????? for ( int i = 0 ; i < objects.length ; i ++){ ???????????? q.setParameter(i, objects[i]); ???????? } ???????? q.executeUpdate(); ???? } ???? public T getEntity(Integer id) { ???????? return (T) sf.getCurrentSession().get(clazz, id); ???? } ???? public T loadEntity(Integer id) { ???????? return (T) sf.getCurrentSession().load(clazz, id); ???? } ???? public Collection<T> findEntityByHQL(String hql, Object... objects) { ???????? Query q = sf.getCurrentSession().createQuery(hql); ???????? for ( int i = 0 ; i < objects.length ; i ++){ ???????????? q.setParameter(i, objects[i]); ???????? } ???????? return q.list(); ???? } }
轉載于:https://my.oschina.net/tinglanrmb32/blog/370444
總結
以上是生活随笔為你收集整理的对Java泛型的简单理解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。