文章

对线面试官 今天来聊聊Java泛型

Java泛型面试漫画对话01

Java泛型面试漫画对话02

Java泛型面试漫画对话03

Java泛型面试漫画对话04

Java泛型面试漫画对话05

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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泛型面试漫画对话06

Java泛型面试漫画对话07

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 传入 需要group by 和 sum 的字段名
public cacheMap(List<String> groupByKeys, List<String> sumValues) {
    this.groupByKeys = groupByKeys;
    this.sumValues = sumValues;
}

private void excute(T e) {

    // 从pojo 取出需要group by 的字段 list
    List<Object> key = buildPrimaryKey(e);

    // primaryMap 是存储结果的Map
    T value = primaryMap.get(key);

    // 如果从存储结果找到有相应记录
    if (value != null) {
        for (String elem : sumValues) {
            // 反射获取对应的字段,做累加处理
            Field field = getDeclaredField(elem, e);
            if (field.get(e) instanceof Integer) {
                field.set(value, (Integer) field.get(e) + (Integer) field.get(value));
            } else if (field.get(e) instanceof Long) {
                field.set(value, (Long) field.get(e) + (Long) field.get(value));
            } else {
                throw new RuntimeException("类型异常,请处理异常");
            }
        }

        // 处理时间记录
        Field field = getDeclaredField("updated", value);
        if (null != field) {
            field.set(value, DateTimeUtils.getCurrentTime());
        }
    } else {
        // group by 字段 第一次进来
        try {
            primaryMap.put(key, Tclone(e));
            createdMap.put(key, DateTimeUtils.getCurrentTime());
        }catch (Exception ex) {
            log.info("first put value error {}" , e);
        }
    }
}

Java泛型面试漫画对话08

Java泛型面试漫画对话09

Java泛型面试漫画对话10

文章以纯面试的角度去讲解,所以有很多的细节是未铺垫的。

比如说反射和泛型基础,这些在【Java3y】都有过详细的基本教程甚至电子书,我就不再详述了。

本文由作者按照 CC BY 4.0 进行授权