Java泛型的作用以及如何使用(继承、接口、方法、通配符) 附源码

news2024/11/25 10:32:59

🍋1. 泛型的定义

class 类名称<泛型标识, 泛型标识, ....>{
    private 泛型标识 变量名称;
    .......
}

常用的泛型标识字符 :T, E, K, V

  • E - Element (在集合中使用,由于集合中存放的是元素),E是对各方法中的泛型类型进行限制,以保证同一个对象调用不一样的方法时,操做的类型一定是相同的。E能够用其它任意字母代替
  •  T - Type(Java 类),T表明在调用时的指定类型。会进行类型推断
  •  K - Key(键)
  •  V - Value(值)
  •  N - Number(数值类型)

我们以下面代码为例定义一个泛型类

public class Test<T> {
    private T key;

    public Test(T key) {
        this.key = key;
    }

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }

    @Override
    public String toString() {
        return "Generic{" +
                "key=" + key +
                '}';
    }
}

创建一个泛型类对象, 并指定为String类型

    public static void main(String[] args) {
        //这里我们指定的String类型
        Generic<String> str = new Generic<>("aaa");
        //返回的类型也是String
        String key = str.getKey();

        //这里我们指定的Integer类型
        Generic<Integer> integer = new Generic<>(1);
        //返回的类型也是Integer
        Integer key1 = integer.getKey();
    }

 🍓2. 泛型的两种继承

方式1 :  泛型派生子类, 子类也是泛型, 那么子类的泛型标识要个父类的保持一致

public class Child<T> extends Parent<T> {

}

方式2 : 泛型派生子类, 如果子类不是泛型类, 那么父类要明确数据类型

public class ChildTow extends Parent<Integer> {
}

🍔3. 泛型接口 

/**
 * 泛型接口
 * @param <T>
 */
public interface Generator<T> {
    T getKey();
}

方式1 : 实现泛型接口的类不是泛型, 需要明确实现泛型接口的数据类型

public class Apple implements Generator<String>{
    @Override
    public String getKey() {
        return "hello";
    }
}

方式2 : 泛型接口的实现类, 是一个泛型类, 那么要保证实现接口的泛型类标识 和泛型接口的一致

public class Pair<T, E> implements Generator<T> {

    @Override
    public T getKey() {
        return null;
    }

}

🍭4. 泛型方法

泛型方法的定义

    /**
     * 测试自定义泛型方法
     * @param list 参数
     * @param <E> 泛型标识, 具体类型, 由调用方法的时候来指定
     * @return
     */
    public <E> E getOne(ArrayList<E> list){
        //返回第一个元素
        return list.get(0);
    }

泛型方法的调用 : 泛型方法的调用, 类型是通过调用方法的时候来指定的

    public static void main(String[] args) {
        Test test = new Test();
        ArrayList<String> str = new ArrayList<>();
        str.add("测试001");
        String one = test.getOne(str);
        System.out.println("one = " + one);

        ArrayList<Integer> num = new ArrayList<>();
        num.add(996);
        System.out.println("num = " + num);
    }

静态泛型方法的定义(多个参数)  泛型可变参数的定义

    /**
     * 泛型可变参数的定义
     * @param e
     * @param <E>
     */
    public static <E> void print(E... e){
        for (E value : e) {
            System.out.println("参数 : " + value);
        }
    }

    //调用
    Test.print("测试", 111, 2.2, new ArrayList<>());


🥭5. 泛型类型通配符

1. 类型通配符上线 :

要求该泛型的类型, 只能是实参类型, 或者实参类型类的类型

下面以Integer为例, 它的父类就是Number类型, 这一点我们从源码中就能得知

        

 实现代码如下,

    public static void showBox(Box<? extends Number> box){
        Number first = box.getFirst();
        System.out.println("first = " + first);
    }

我们最后传入的参数只能是Number以及他的子类Integer类型

    public static void main(String[] args) {
        Box<Integer> objectBox = new Box<>();
        objectBox.setFirst(11111);
        showBox(objectBox);
    }

2.类型通配符下线 : 

要求该泛型的类型, 只能是实参类型, 或者实参类型类的类型

这里为了便于讲解实现了三个类

/**
 * 爷爷类
 */
public class Grandfather {
}
/**
 * 父亲类
 */
public class Father extends Grandfather{
}
/**
 * 儿子类
 */
public class Son extends Father {
}

下线通配符代码实现如下

    public static void family(List<? super Father> item){
        for (Object o : item) {
            System.out.println(o);
        }
    }

    //调用
    family(new ArrayList<Son>());
    family(new ArrayList<Grandfather>());

可以看出当下线设置为<? super Father> 的时候传入的参数只能是爸爸的上级也就是爷爷类(Grandfather), 传入儿子类(Son)就会产生报错


🍖6. 泛型代码

扫描下方公众号二维码 回复: 泛型 即可领取项目源码 👇👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微服务技术06】Nacos注册中心

【微服务技术06】Nacos注册中心 案例代码&#xff1a;https://gitee.com/pikachu2333/spring-cloud-hexuan 安装Nacos 安装nacos&#xff1a;https://github.com/alibaba/nacos/releases 单机启动&#xff1a;sh startup.sh -m standalone 访问&#xff1a;http://127.0.0.1…

操作系统,计算机网络,数据库刷题笔记10

操作系统&#xff0c;计算机网络&#xff0c;数据库刷题笔记10 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xf…

yolov5修改骨干网络-使用pytorch自带的网络-以Mobilenet和efficientnet为例

通过 yolov5修改骨干网络–原网络说明 我们知道&#xff1a;yolov5.yaml中存放的是我们模型构建参数&#xff0c;具体构建过程在yolo.py中的parse_model函数&#xff0c;通过循环遍历yolov5.yaml给的参数&#xff0c;去寻找网络名称&#xff0c;并将args的参数传入网络&#xf…

获取bean的三种方式和注意事项

获取bean的三种方式和注意事项 spring-ioc.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc…

PUMA:DOA估计模式的改进实现(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

北京旅游HTML学生网页设计作品 dreamweaver作业静态HTML网页设计模板 北京旅游景点网页作业制作 HTML+CSS+JS

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

口诀速记 DataFrame 指定行列的数据

口诀速记DataFrame 指定行列的数据一、loc函数和iloc函数获取指定行列的数据二、loc和iloc的切片操作三、[] 语法获取指定行列的数据✅作者简介&#xff1a;大家好我是爱康代码 &#x1f4c3;个人主页&#xff1a;链接: 点一下这里就进入爱康代码的主页链接&#xff0c;欢迎参观…

深入:9种设计模式在Mybatis中的运用

虽然我们都知道有26个设计模式&#xff0c;但是大多停留在概念层面&#xff0c;真实开发中很少遇到&#xff0c;Mybatis源码中使用了大量的设计模式&#xff0c;阅读源码并观察设计模式在其中的应用&#xff0c;能够更深入的理解设计模式。 Mybatis至少遇到了以下的设计模式的…

接口优化技巧

1. 批量思想&#xff1a;批量操作数据库 优化前&#xff1a; //for循环单笔入库 for(TransDetail detail:transDetailList){insert(detail); }优化后&#xff1a; batchInsert(transDetailList);打个比喻&#xff1a; 打个比喻:假如你需要搬一万块砖到楼顶,你有一个电梯,电…

怎么进行多人配音?建议收藏这些方法

相信不少小伙伴平时在网上冲浪的时候&#xff0c;经常会刷到一些搞笑视频吧。这些搞笑视频的配音&#xff0c;通常都是以一人分饰多角或者是多人互动对话的形式进行配音的。那有没有小伙伴有着不错的搞笑创意点子&#xff0c;但是苦于没有人配音呢&#xff1f;其实我们可以使用…

电脑之间通信的大致过程

本文来自对网络工程师之路内容的个人总结&#xff0c;仅供个人复习参考。 1.电脑之间通信就需要有线路&#xff0c;但是如果多台电脑互相之间需要通信&#xff0c;那么就需要有很多根线&#xff0c;每台电脑需要有多网卡&#xff0c;为了解决这个问题&#xff0c;(集线器)Hub就…

360度内环镜、内螺纹检测镜头、瓶盖检测镜头以及超中心镜头

用于孔洞状物体的360内部成像 提示&#xff1a; 内孔检测光学镜头 从外部检查腔内&#xff1b;无需在孔洞内放置光学探头&#xff1b;带孔对象的360度对焦&#xff1b;腔体内壁和底部都可以实现高分辨率成像&#xff1b;景深可使同一个镜头拍摄具有不同形状和尺寸的物体&…

Bidirectional Recurrent Neural Networks

摘要 a regular recurrent neural network &#xff08;RNN&#xff09; →\rightarrow→ a bidirectional recurrent neural network (BRNN)a preset future frame&#xff1a; 预设的未来架构。. Structure and training procedure&#xff1a; 架构和训练程序。TIMIT datab…

Java多线程之:详解ThreadPoolExecutor执行源码分析

文章目录线程池的实现原理详解ThreadPoolExecutor核心数据结构核心配置参数解释线程池的优雅关闭线程池的生命周期正确关闭线程池的步骤shutdown()与shutdownNow()的区别任务的提交过程分析任务的执行过程分析shutdown()与任务执行过程综合分析shutdownNow() 与任务执行过程综合…

【大一大二必看】计算机专业的同学应该参加哪些比赛?

文章目录1. 前言2. ICPC3. CCPC4. 蓝桥杯5. 天梯赛6. CCF CSP7. PAT8. 全国高校计算机能力挑战赛9. 其他&#x1f351; 天池大赛&#x1f351; 华为软件精英挑战赛&#x1f351; LeetCode 周赛 / 双周赛&#x1f351; CSDN 编程竞赛总结1. 前言 2022 年已经过半&#xff0c;对…

java版商城 b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案&#xff1f;以下是我结合公司的产品做的总结&#xff0c;希望可以帮助到大家&#xff01; 搜索体验小程序&#xff1a;海哇 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买…

巡检过程中有哪些注意事项?智能巡检了解一下

智能巡检系统是现场过程管理的生产力革命&#xff0c;由人工记录蝶化为掌上电脑运作&#xff0c;适用于设备运行值班记录、仓库/资产管理、设备巡检保养、安全巡更、机房值守、基站维护等一切重复性的工作管理。 安全巡检的目的在于识别信息系统存在的安全脆弱性、分析信息系统…

2022-12-14 移植Qt Creator helloworld 应用到ARM平台运行过程,我这里用buildroot里面的编译器。

一、在ubuntu上运行可执行文件。 1、ubuntu里面安装qt creator 建立helloworld 工程&#xff0c;点击run就可以运行&#xff0c;运行如下。 2、在ubuntu上运行方法二&#xff1a;同级目录下有build-helloworld-Desktop_Qt_5_12_12_GCC_64bit-Debug&#xff0c;用file hellowor…

VS使用技巧汇总

总目录 文章目录总目录前言一、快捷技巧1.代码片段快捷方式2.选择性粘贴3.快速停靠窗口4.多行同步快速编辑5.引用命名空间6.整行上下移动7.规整代码格式二、其他技巧1.其他总结前言 本文会持续收录一些VS的使用技巧&#xff0c;掌握VS一些常用的使用技巧对于提高我们编程效率很…

MA-Net:用于肝脏和肿瘤分割的多尺度注意力网络

摘要 近年来为了提高医学图像分割的性能&#xff0c;提出了大量基于多尺度特征融合的UNet变体。与以往通过多尺度特征融合提取医学图像上下文信息的方法不同&#xff0c;本文提出了一种新的多尺度注意力网格&#xff08;MA-Net&#xff09;在这个网络方法中引入了自注意力机制…