CommonDAOImpl中泛型使用

本文探讨了在CommonDAOImpl中使用泛型扩展find()方法的适用范围,并给出了具体的实现方式。通过参数化类型获取实体类,使得方法更加灵活通用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CommonDAOImpl是所有DAOImpl的父类,里面包含了所有DAO类会使用到的公共方法,比如说update(),save(),find()等方法
在查找操作时候,有这样的find()方法
public T findObjecByID(Serializable id) {
//下面的entity是相应实体类
return (T)this.getHibernateTemplate().get(entity.class, id);
}
但是这样的方法不能放在CommonDAOImpl中而只能放在相应的DAO中,因为entity.class已经写死,所以需要使用到泛型,来扩展find()方法的使用范围,更好的方法如下

public T findObjecByID(Serializable id) {
//泛型转换
ParameterizedType pt=(ParameterizedType) this.getClass().getGenericSuperclass();
Class entity=(Class) pt.getActualTypeArguments()[0];
return (T)this.getHibernateTemplate().get(entity, id);
}

我也曾想过,可不可以这样写
public T findObjecByID(Serializable id) {
//下面的entity是相应实体类
return (T)this.getHibernateTemplate().get(Object.class, id);
}
将entity.class换成Object.class
实际上这种方法是不可行的,junit测试会抛出异常
org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: java.lang.Object; nested exception is org.hibernate.MappingException: Unknown entity: java.lang.Object
因为Object类型对象实体没有映射文件关联

### TypeScript 中使用场景和方法 #### 1. 在函数中的应用 通过定义函数,可以实现更灵活的类约束。例如,在处理数组的第一个元素时,可以通过建立输入和输出之间的关系[^4]。 ```typescript function firstElement<Type>(arr: Type[]): Type | undefined { return arr[0]; } // s 的类为 'string' const s = firstElement(["a", "b", "c"]); // n 的类为 'number' const n = firstElement([1, 2, 3]); // u 的类为 undefined const u = firstElement([]); ``` 上述代码展示了如何利用让编译器自动推断出返回值的具体类。 --- #### 2. 在接口中的应用 除了函数外,还可以在接口中使用来描述具有通用类的对象结构。这使得接口能够适应多种数据类的需求[^1]。 ```typescript interface GenericIdentityFn<T> { (value: T): T; } function identity<T>(arg: T): T { return arg; } let myIdentity: GenericIdentityFn<number> = identity; console.log(myIdentity(5)); // 输出:5 ``` 在此示例中,`GenericIdentityFn` 接口接受一个类参数 `T` 并将其用于函数签名中。 --- #### 3. 在类中的作用 当需要在整个类的作用域范围内保持一致的类时,可以选择使用类。相比方法,它的适用范围更大,适用于整个实例生命周期内的类管理[^2]。 ```typescript class GenericNumber<T> { zeroValue!: T; add!: (x: T, y: T) => T; } const genericInt = new GenericNumber<number>(); genericInt.zeroValue = 0; genericInt.add = function(x, y) { return x + y; }; console.log(genericInt.add(10, 20)); // 输出:30 ``` 此代码片段展示了一个支持任意数值类的容器类。 --- #### 4. 处理复杂动态行为 对于 JavaScript 动态特性难以捕捉的情况,比如访问对象属性的操作,也可以借助提供更强的安全保障[^3]。 ```typescript function prop<K extends keyof any, V>(obj: Record<K, V>, key: K): V { return obj[key]; } const user = { name: "Alice", age: 25 }; console.log(prop(user, "name")); // 输出:"Alice" console.log(prop(user, "age")); // 输出:25 ``` 这里通过键值对映射的方式增强了类安全性。 --- ### 总结 TypeScript 的机制允许开发者编写更加抽象化、可重用性强以及具备良好类检查功能的代码。无论是简单还是复杂的业务逻辑都可以从中受益匪浅。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值