2024年泛型(Generic)_(2),我三年开发经验从字节跳动抖音离职后

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

定义一个Java泛型类,泛型类中的成员变量的类型可以通过类对象实例化时进行约束,测试如下,

public class GenericTest {
    public static void main(String[] args) {
        GenericClass<String> generic1 = new GenericClass<>("item");
        GenericClass<Long> generic2 = new GenericClass<>(123L);
        System.out.println(generic1.getItem().getClass().getName());//java.lang.String
        System.out.println(generic2.getItem().getClass().getName());//java.lang.Long
    }
}
泛型接口

Java泛型接口和泛型类基本类似,用过Mybatis或者Mybaits-plus的同学应该都知道使用代码自动生成工具生成的Mapper文件里BaseMapper就是一个泛型接口,把它作为示例。

package com.baomidou.mybatisplus.core.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;

public interface BaseMapper<T> extends Mapper<T> {
    int insert(T entity);

    int deleteById(Serializable id);

    int deleteByMap(@Param("cm") Map<String, Object> columnMap);

    int delete(@Param("ew") Wrapper<T> wrapper);

    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    int updateById(@Param("et") T entity);

    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

    T selectById(Serializable id);

    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);

    T selectOne(@Param("ew") Wrapper<T> queryWrapper);

    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);

    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);

    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);

    IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);

    IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
}

然后数据库表的接口继承BaseMapper,各个数据库表接口的实现继承ServiceImpl类就具备了增删改查的基本功能了。

/**
  * IService 实现类( 泛型:M 是 mapper 对象,T 是实体 , PK 是主键泛型 )
  */
public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {

    protected Log log = LogFactory.getLog(getClass());

    @Autowired
    protected M baseMapper;

    @Override
    public M getBaseMapper() {
        return baseMapper;
    }
    //... 省略 ...
}
泛型方法

上面的栗子里其实包含了泛型类、泛型接口和泛型方法,下面再举一个单纯的泛型方法,直接打印泛型的数据类型。

    private static  <T> void printGeneric(T t){
        System.out.println(t.getClass().getName());
    }
实际应用

下面看一个实际应用,比如以太专线和以太专网的公共属性类为以太连接。

以太连接父类:

@Data
public class EthConnection {
    private String attribute;
}

以太专线子类:

@Data
public class ELineConnection extends EthConnection{
    private String uuid;
}

以太专网子类:

@Data
public class ELanConnection extends EthConnection{
    private String uuid;
}

比如我想对以太专线和以太专网子类传入它们共有的属性,那么我得像下面这么做,

public class GenericDemo {
    public static void main(String[] args) {
        String attr = "commonAttribute";
        List<ELanConnection> eLanConnectionList = buildELanConnection(attr);
        List<ELineConnection> eLineConnectionList = buildELineConnection(attr);
        eLanConnectionList.stream().forEach(System.out::println);
        eLineConnectionList.stream().forEach(System.out::println);
    }

    private static List<ELanConnection> buildELanConnection(String attr) {
        ELanConnection connection = new ELanConnection();
        connection.setAttribute(attr);
        return Lists.newArrayList(connection);
    }

    private static List<ELineConnection> buildELineConnection(String attr) {
        ELineConnection connection = new ELineConnection();
        connection.setAttribute(attr);
        return Lists.newArrayList(connection);
    }
}

这里共有属性不多,感觉没啥,但如果它们需要传入的共有属性很多且都相同,那么重复的代码就太多了。设置共同属性的代码段可以抽取出来,如果属性不多,我下面这种做法也许显得很多余。这样设计是否合适大家可以一起品一品。

public class GenericDemo {
    private static final int ELAN_TAG = 1;
    private static final int ELINE_TAG = 2;
    public static void main(String[] args) {
        String attr = "commonAttribute";
        List<ELanConnection> eLanConnectionList = buildELanConnection(attr);
        List<ELineConnection> eLineConnectionList = buildELineConnection(attr);
        eLanConnectionList.stream().forEach(System.out::println);
        eLineConnectionList.stream().forEach(System.out::println);
    }

    private static List<ELanConnection> buildELanConnection(String attr) {
        return castELanConnection(buildConnection(attr, ELAN_TAG));
    }

    private static List<ELineConnection> buildELineConnection(String attr) {
        return castELineConnection(buildConnection(attr, ELINE_TAG));
    }

    private static List<ELanConnection> castELanConnection(List<? extends EthConnection> connections) {
        if (CollectionUtils.isEmpty(connections)){
            return Lists.newArrayList();
        }
        return connections.stream().map(ELanConnection.class::cast).collect(Collectors.toList());
    }

    private static List<ELineConnection> castELineConnection(List<? extends EthConnection> connections) {
        if (CollectionUtils.isEmpty(connections)){
            return Lists.newArrayList();
        }


![img](https://img-blog.csdnimg.cn/img_convert/8388c00a33356e50fa5dccdc4ee0d8ad.png)
![img](https://img-blog.csdnimg.cn/img_convert/10c54b6ca75030cdc5d90f3e0f9c8da3.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值