Java泛型
2. 泛型類:泛型只在編譯時期有效,編譯后的字節(jié)碼文件中不存在有泛型信息!
1. 泛型方法:
public class GenericDemo {
// 定義泛型方法
public <K,T> T save(T t,K k) {
return null;
}
// 測試方法
@Test
public void testMethod() throws Exception {
// 使用泛型方法: 在使用泛型方法的時候,確定泛型類型
save(1.0f, 1);
}
}
2. 泛型類:
public class GenericDemo<T> {
// 定義泛型方法
public <K> T save(T t,K k) {
return null;
}
public void update(T t) {
}
// 測試方法
@Test
public void testMethod() throws Exception {
// 泛型類: 在創(chuàng)建愛泛型類對象的時候,確定類型
GenericDemo<String> demo = new GenericDemo<String>();
demo.save("test", 1);
}
3. 泛型接口:
/**
* 泛型接口
* @author Jie.Yuan
*
* @param <T>
*/
public interface IBaseDao<T> {
void save(T t );
void update(T t );
}
泛型接口類型確定: 實現(xiàn)泛型接口的類也是抽象,那么類型在具體的實現(xiàn)中確定或創(chuàng)建泛型類的時候確定。
泛型的反射
泛型的反射
/**
* 所有dao的公用的方法,都在這里實現(xiàn)
* @author Jie.Yuan
*
*/
public class BaseDao<T>{
// 保存當(dāng)前運(yùn)行類的參數(shù)化類型中的實際的類型
private Class clazz;
// 表名
private String tableName;
// 構(gòu)造函數(shù): 1. 獲取當(dāng)前運(yùn)行類的參數(shù)化類型; 2. 獲取參數(shù)化類型中實際類型的定義(class)
public BaseDao(){
// this 表示當(dāng)前運(yùn)行類 (AccountDao/AdminDao)
// this.getClass() 當(dāng)前運(yùn)行類的字節(jié)碼(AccountDao.class/AdminDao.class)
// this.getClass().getGenericSuperclass(); 當(dāng)前運(yùn)行類的父類,即為BaseDao<Account>
// 其實就是“參數(shù)化類型”, ParameterizedType
Type type = this.getClass().getGenericSuperclass();
// 強(qiáng)制轉(zhuǎn)換為“參數(shù)化類型” 【BaseDao<Account>】
ParameterizedType pt = (ParameterizedType) type;
// 獲取參數(shù)化類型中,實際類型的定義 【new Type[]{Account.class}】
Type types[] = pt.getActualTypeArguments();
// 獲取數(shù)據(jù)的第一個元素:Accout.class
clazz = (Class) types[0];
// 表名 (與類名一樣,只要獲取類名就可以)
tableName = clazz.getSimpleName();
}
/**
* 主鍵查詢
* @param id 主鍵值
* @return 返回封裝后的對象
*/
public T findById(int id){
/*
* 1. 知道封裝的對象的類型
* 2. 表名【表名與對象名稱一樣, 且主鍵都為id】
*
* 即,
* ---》得到當(dāng)前運(yùn)行類繼承的父類 BaseDao<Account>
* ----》 得到Account.class
*/
String sql = "select * from " + tableName + " where id=? ";
try {
return JdbcUtils.getQuerrRunner().query(sql, new BeanHandler<T>(clazz), id);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 查詢?nèi)?/span>
* @return
*/
public List<T> getAll(){
String sql = "select * from " + tableName ;
try {
return JdbcUtils.getQuerrRunner().query(sql, new BeanListHandler<T>(clazz));
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}