泛型的理解:
使用泛型的好处
就是代码更加的简洁(不需要强制转化),程序更加的健壮(在编译期间没有警告,在运行期就不会出现ClassCastException异常)。
平时工作中是否使用?
在操作集合的时候,还是很多的,毕竟方便啊。List lists = new ArrayList<>();
还在其他的场景使用吗?
写基础组件的时候用过。
再明确一下【在创建对象或调用方法的时候才明确下具体的类型】。而组件为了做到足够的通用性,是不知道用户传入什么类型参数进来的,所以这种情况下用泛型就是很好的实践。
这块可以参考springData jpa的JpaRepository写法。
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort sort);
List<T> findAllById(Iterable<ID> ids);
<S extends T> List<S> saveAll(Iterable<S> entities);
void flush();
<S extends T> S saveAndFlush(S entity);
void deleteInBatch(Iterable<T> entities);
void deleteAllInBatch();
T getOne(ID id);
@Override
<S extends T> List<S> findAll(Example<S> example);
@Override
<S extends T> List<S> findAll(Example<S> example, Sort sort);
}
- 要写组件还是离不开Java反射机制(能够从运行时获取信息),所以一般组件是泛型+反射来实现的。
- 回到所讲的组件,这边有一个需求,根据某些字段进行聚合。
换到SQL就是:
select sum(column1),sum(column2) from table group by filed1,field2;
我们需要根据sum和group by的列肯定是由业务方自己传入,而sql的表其实就是我们的pojo(传入的字段也肯定是pojo的属性)。
- 单个业务实际可以在参数上写死pojo,但为了做到更加的通用,我们把入参设置为泛型。
- 拿到参数后,通过反射获取其字段具体的值,做累加就好了。
- 上代码:
```java
// 传入 需要group by 和 sum 的字段名
public cacheMap(List
groupByKeys, List sumValues) { this.groupByKeys = groupByKeys; this.sumValues = sumValues; }
private void excute(T e) {
// 从pojo 取出需要group by 的字段 list List