java~泛型

news2024/11/18 21:38:25

目录

泛型

泛型的声明

泛型的实例化

泛型的使用细节

自定义泛型类

自定义泛型接口

自定义泛型方法

泛型的继承和通配符

Junit 单元测试类


泛型

        检查添加元素的类型

        减少了类型转换的次数,直接对这个类型进行遍历,例如arraylist<>()

public class Main {
    public static void main(String[] args) {
        Person<String> person1 = new Person<>("xiaoming");
        Person<Integer> person2 = new Person<>(100);
    }
}

//E表示s的数据类型,在定义Person对象的时候指定,即在编译期间,就确定E是什么
class Person<E> {
    E s;

    public Person(E s) {
        this.s = s;
    }
    public E f() {
        return s;
    }
}


泛型的声明

        interface接口 {} 和class 类<K, V...> {}
        例如: List,ArrayList
        说明:
                其中,T,K,V不代表值,而是代表类型
                任意字母都行,常用T表示。


泛型的实例化


        需要在类名后面指定类型参数的值(类型),例如:

        List< String > strList = new ArrayList< String>();

        迭代器取值
        Iterator< Customer> iterator = customers.iterator()

泛型的使用细节

        1、给泛型指定数据类型时,要求是引用类型,不能是基本数据类型,自动装箱。

        2、在给泛型指定具体类型后,可以传入该类型或该类型的子类。

        3、右边的尖括号可以省略,推荐          List< String > strList = new ArrayList<>();

        4、如果不指明泛型类型,默认为 Object 。

        5、静态方法和静态属性不能使用泛型。因为静态和类相关,在类加载时,对象还没有创建,JVM 无法实现初始化。

自定义泛型类

  1. 普通成员可以使用泛型(属性,方法)
  2. 使用泛型的数组不可初始化
  3. 静态方法不能使用类的泛型,静态只和类有关,类加载时,对象还没创建
  4. 泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
  5. 如果在创建对象时,没有指定类型,默认为Object,推荐写Object
class Person<E, T> {
    E s;
    T[] ts;//不能初始化,因为数组在new的时候不能确定T的类型,无法在内存开辟空间

    public Person(E s) {
        this.s = s;
    }
    public E f() {
        return s;
    }

    public Person(E s, T[] ts) {
        this.s = s;
        this.ts = ts;
    }
}

自定义泛型接口

        

  1. 接口中,静态成员也不能使用泛型,属性是静态的
  2. 泛型接口的类型,在继承接口或者实现接口时确定
  3. 没有指定类型,默认Object

自定义泛型方法

  1. 泛型方法,可以定义在普通类中,也可以定义在泛型类中
  2. 当泛型方法被调用时,类型会确定
  3. public void eat(E e) {}, 修饰符后面没有< T, R…> 因此,eat方法不是泛型方法,只是使用了泛型. 
public class CustomMethodGeneric {
    public static void main(String[] args) {
        Car car = new Car();
        car.fly("宝马", 100);//当调用方法时,传入参数,编译器,就会确定类型
        System.out.println("=======");
        car.fly(300, 100.1);//当调用方法时,传入参数,编译器,就会确定类型

        //测试
        //T->String, R-> ArrayList
        Fish<String, ArrayList> fish = new Fish<>();
        fish.hello(new ArrayList(), 11.3f);
    }
}

//泛型方法,可以定义在普通类中, 也可以定义在泛型类中
class Car {//普通类

    public void run() {//普通方法
    }
    //说明 泛型方法
    //1. <T,R> 就是泛型
    //2. 是提供给 fly使用的
    public <T, R> void fly(T t, R r) {//泛型方法
        System.out.println(t.getClass());//String
        System.out.println(r.getClass());//Integer
    }
}

class Fish<T, R> {//泛型类
    public void run() {//普通方法
    }
    public<U,M> void eat(U u, M m) {//泛型方法

    }
    //说明
    //1. 下面hi方法不是泛型方法
    //2. 是hi方法使用了类声明的 泛型
    public void hi(T t) {
    }
    //泛型方法,可以使用类声明的泛型,也可以使用自己声明泛型
    public<K> void hello(R r, K k) {
        System.out.println(r.getClass());//ArrayList
        System.out.println(k.getClass());//Float
    }

}

泛型的继承和通配符

        泛型不具备继承性

  1. < ?> :表示支持任意泛型类型

  2. < ? extends A >:支持A类及A类的子类,规定了泛型的上限

  3. < ? super A > ;支持A类及A类的父类,不限于直接父类,规定了泛型的下限

public class GenericExtends {
    public static void main(String[] args) {

        Object o = new String("xx");

        //泛型没有继承性
        //List<Object> list = new ArrayList<String>();

        //举例说明下面三个方法的使用
        List<Object> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<AA> list3 = new ArrayList<>();
        List<BB> list4 = new ArrayList<>();
        List<CC> list5 = new ArrayList<>();

        //如果是 List<?> c ,可以接受任意的泛型类型
        printCollection1(list1);
        printCollection1(list2);
        printCollection1(list3);
        printCollection1(list4);
        printCollection1(list5);

        //List<? extends AA> c: 表示 上限,可以接受 AA或者AA子类
//        printCollection2(list1);//×
//        printCollection2(list2);//×
        printCollection2(list3);//√
        printCollection2(list4);//√
        printCollection2(list5);//√

        //List<? super AA> c: 支持AA类以及AA类的父类,不限于直接父类
        printCollection3(list1);//√
        //printCollection3(list2);//×
        printCollection3(list3);//√
        //printCollection3(list4);//×
        //printCollection3(list5);//×


        //冒泡排序

        //插入排序

        //....


    }
    // ? extends AA 表示 上限,可以接受 AA或者AA子类
    public static void printCollection2(List<? extends AA> c) {
        for (Object object : c) {
            System.out.println(object);
        }
    }

    //说明: List<?> 表示 任意的泛型类型都可以接受
    public static void printCollection1(List<?> c) {
        for (Object object : c) { // 通配符,取出时,就是Object
            System.out.println(object);
        }
    }



    // ? super 子类类名AA:支持AA类以及AA类的父类,不限于直接父类,
    //规定了泛型的下限
    public static void printCollection3(List<? super AA> c) {
        for (Object object : c) {
            System.out.println(object);
        }
    }

}

class AA {
}

class BB extends AA {
}

class CC extends BB {
}


Junit 单元测试类

        1、JUnit 是一个 Java 语言的单元测试框

        2、多数 Java 的开发环境都已经集成了 Junit 作为单元测试的工具。

        3、使用步骤

           在方法前加 @Test 注解,等待下载 Maven 依赖

           Add Junit to classPath

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

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

相关文章

Python酷库之旅-第三方库Pandas(072)

目录 一、用法精讲 291、pandas.Series.dt.round函数 291-1、语法 291-2、参数 291-3、功能 291-4、返回值 291-5、说明 291-6、用法 291-6-1、数据准备 291-6-2、代码示例 291-6-3、结果输出 292、pandas.Series.dt.floor函数 292-1、语法 292-2、参数 292-3、…

贪吃蛇游戏的实现:C++ 控制台版

功能概述 控制蛇的移动&#xff1a;使用WASD键控制蛇的移动方向。随机生成食物&#xff1a;蛇吃到食物后&#xff0c;食物会在游戏区域内随机生成。显示分数&#xff1a;游戏中会显示当前分数。游戏结束条件&#xff1a;当蛇碰到自己或走出边界时&#xff0c;游戏结束并显示“…

从巴黎到乐清,奥运精神引领全民健身新风尚!

16位火炬手接力&#xff0c;乐清点燃全民健身新篇章&#xff01; 作者&#xff1a;华夏之音总监&#xff0f;李望 在巴黎奥运会如火如荼进行的第11天&#xff0c;中国体育代表团以22枚金牌的骄人战绩领跑金牌榜&#xff0c;每一枚金牌都闪耀着中华体育精神的璀璨光芒&#xff…

c++ 连接mysql

其实就是MYsql c语言的API #define _CRT_SECURE_NO_WARNINGS 1 #define HOST "192.168.226.1" #define USER "root" #define PASSWORD "123456" #define PORT 3066#include <iostream> #include <stdlib.h> #include <mysql.…

【北斗授时服务】NTP网络时间服务器 安徽京准智造

【北斗授时服务】NTP网络时间服务器 安徽京准智造 【北斗授时服务】NTP网络时间服务器 安徽京准智造 一、NTP网络时间服务器产品介绍&#xff1a; NTP网络时间服务器是针对计算机、自动化装置等进行校时而研发的高科技设备&#xff0c;该产品可从GPS卫星&#xff08;北斗卫星、…

数据采集工具之Canal

本文主要介绍canal采集mysql数据的tcp、datahub(kafka)模式如何实现 1、下载canal https://aliyun-datahub.oss-cn-hangzhou.aliyuncs.com/tools/canal.deployer-1.1.5-SNAPSHOT.tar.gz 2、TCP模式的实现 a、canal.properties 打开看看即可&#xff0c;不需要调整 ######…

蚁群求解旅行商问题(TSP)的MATLAB例程

程序概况 输入需要经过的节点坐标&#xff1a; 运行程序后&#xff0c;即可得到&#xff1a; 运行结果 左图为遍历各点的运动轨迹&#xff0c;最终会回到起点右图为平均距离&#xff08;红线&#xff09;和最短距离在迭代时的变化情况 源代码 代码下载链接如下&#xff1a…

【工具类】JAVA (Android Studio )+ JS 加密解密 AES + Base 64

JAVA &#xff08;Android Studio &#xff09; JS 加密解密 AES Base 64 前言JAVA 代码&#xff08;解密&#xff09;JS代码&#xff08;加密&#xff09; 前言 整个过程&#xff1a; JS 接口先用AES加密&#xff0c;然后加密内容转Base64 编码&#xff1b;JAVA进行Base64解…

虹科干货 | 如何确保干冰运输的安全和稳定?

在上篇文章中&#xff0c;我们介绍了液氮罐运输和存储温度监测解决方案&#xff0c;本文我们将会了解医药供应链中干冰运输和温度监测的关键要点。 干冰在医药行业的应用 干冰是固体二氧化碳&#xff0c;当表面温度为 -78.5℃时&#xff0c;一块冷冻的干冰会直接转变为气体&am…

Ubuntu-18.04.1安装JetBrains PyCharm 2018.1.6 专业版(永久破解方法)

软件安装包下载地址&#xff1a;Other Versions - PyCharm 将安装包放置Ubuntu系统中解压&#xff0c;到bin目录下找到pycharm.sh即可打开。 补丁破解方式&#xff08;需关闭软件pycharm&#xff0c;否则会打不开pycharm&#xff01;&#xff01;&#xff01;&#xff09;&am…

昂科烧录器支持MindMotion灵动微电子的32位微控制器MM32F5287L9P

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中MindMotion灵动微电子的32位微控制器MM32F5287L9P已经被昂科的通用烧录平台AP8000所支持。 MM32F5287L9P搭载Armv8-M 架构“星辰”STAR-MC1处理器&#xff0c;最高工作频率可达…

CSS技巧专栏:一日一例 20-纯CSS实现点击会凹陷的按钮

本例图片 案例分析 其实这个按钮非常的简单啊&#xff0c;主要就是利用了box-shadow的inset。 布局代码 <button class"base">凹下的按钮</button> 基础样式 :root{--main-bg-color: #dcdcdc; /* 将页面背景色调整为浅灰色 */--color:#000;--hover-…

Cesium手动建模模型用Cesiumlab转3D Tiles模型位置不对,调整模型位置至指定经纬度

Cesium加载3Dtiles模型的平移和旋转_3dtiles先旋转再平移示例-CSDN博客 Cesium 平移cesiumlab生产的3Dtiles切片模型到目标经纬度-CSDN博客 【ArcGISCityEngine】自行制作Lod1城市大尺度白膜数据_cityengine 生成指定坐标集指定区域的白模-CSDN博客 以上次ArcGISCityEngine制…

IEEE Transactions on Intelligent Transportation Systems投稿指南

投稿记录 submitted 2024-5-29 Awaiting AE Assignment 2024-6-11 Under review 2024-6-15 Awaiting EIC Decision 2024-6-24 感觉要拒稿的节奏 Resubmit To Another Journal 2024-6-25 与期刊不符合 下载模板 IEEE Transactions on Intelligent Transportation Syste…

java.lang.NoClassDefFoundError: ch/qos/logback/core/util/StatusPrinter2

1、问题 SpringBoot升级报错&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/core/util/StatusPrinter2 类找不到&#xff1a; Caused by: java.lang.ClassNotFoundException: ch.qos.logback.core.util.StatusPrinter22、…

【Vue3】Pinia $subscribe

【Vue3】Pinia $subscribe 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子…

前端框架(三件套)

学习网站 HTML 系列教程&#xff08;有广告&#xff09; HTML&#xff08;超文本标记语言&#xff09; | MDN (mozilla.org)&#xff08;英文不太友好&#xff09; 1.HTML5 & CSS3 1.1HTML5表格 <!DOCTYPE html> <html lang"en"> <head>…

常见框架漏洞详解②!!

中间件 中间件&#xff08;英语&#xff1a;Middleware&#xff09;是提供系统软件和应⽤软件之间连接的软件&#xff0c;以便于软件各部 件之间的沟通。 中间件处在操作系统和更⾼⼀级应⽤程序之间。他充当的功能是&#xff1a;将应⽤程序运⾏环境与操作系统隔离&#xff0c;…

setState执行机制

当this.setState()被调用时&#xff0c;React会重新调用render方法来重新绘制UI 异步更新 setState通过一个队列机制实现state的更新当执行setState时&#xff0c;会将需要更新的state合并后放入状态队列&#xff0c;而不是立刻更新队列机制可以高效的批量更新state&#xff…

武汉流星汇聚:亚马逊跨境电商蓝海中的领航者,共绘商业新蓝图

在全球化日益加深的今天&#xff0c;跨境电商已成为连接世界市场的桥梁&#xff0c;为企业提供了前所未有的发展机遇。在这片充满机遇的蓝海中&#xff0c;武汉流星汇聚电子商务有限公司凭借其深厚的行业底蕴、卓越的用户体验以及“以客户为中心”的坚定理念&#xff0c;在亚马…