Java中的泛型(类,方法,接口)与可变参数

2023-11-07

泛型

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数

参数化类型:将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型

参数化类型可以用在类,方法和接口中,分别被称为:泛型类,泛型方法,泛型接口

泛型的好处

  • 把运行时期的错误提前到了编译期间
  • 避免了强制类型转换

泛型类

定义格式:修饰符 class 类名 < 类型 > { } (如 public class Run< T > { } ,其中,T为随意标识,T ,E ,V ,K 一般都用来标识泛型)

// Box.java
public class Box<T> {	// 泛型类
   
  private T t;	// 泛型
 
  public void add(T t) {	// 可以接收任何类型
    this.t = t;
  }
 
  public T get() {
    return t;
  }
    
// main.java
  public static void main(String[] args) {
    Box<Integer> integerBox = new Box<Integer>();
    Box<String> stringBox = new Box<String>();
 
    integerBox.add(new Integer(10));
    stringBox.add(new String("菜鸟教程"));
 
    System.out.printf("整型值为 :%d\n\n", integerBox.get());	// 整型值为 :10
    System.out.printf("字符串为 :%s\n", stringBox.get());	// 字符串为 :菜鸟教程
  }
}

泛型方法

定义格式:修饰符< 类型 > 返回值类型 方法名( 类型 变量名 ){ },(如 public < T > void run( T t ) { })

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

        Demo demo = new Demo();
        demo.run(1);	// 1 is running
        demo.run(3.33333333);	// 3.33333333 is running
        demo.run("小飞侠");	// 小飞侠 is running
    }
    public <T> void run(T t){
        System.out.println(t + " is running");
    }

}

泛型接口

定义格式:修饰符 interface 接口名 < 类型 > { } ,如( public interface Generic < T > { } )

// Run.java
public interface Run<T> {	// 泛型接口
    void run(T t);
}

// RunImpl.java
public class RunImpl<T> implements Run<T> {	// 泛型接口的实现类

    @Override
    public void run(T t) {
        System.out.println(t + " is running");
    }
}

//Demo.java
public class Demo{
    public static void main(String[] args) {
        RunImpl<Object> r = new RunImpl<>();
        r.run("s");	// s is running
        r.run(1);	// 1 is running
        boolean flag = true;	
        r.run(flag);	// true is running
    }

}

类型通配符

  • 类型通配符:< ? >
  • List< ? >:表示元素类型未知的List,他的元素可以匹配任何类型
  • 这种带通配符的List仅表示他是各种泛型List的父亲,并不能把元素添加到其中

设置类型通配符的上限

类型通配符上限:< ? extends 类型 > ,List< ? extends Number >表示他的类型是Number或者他的子类型

设置类型通配符的下限

类型通配符下限: < ? super 类型 > ,List< ? super Number > 表示他的类型是Number或者他的父类型

public static void main(String[] args) {
    	// Object > Number > Integer
    	// 类型通配符
        List<?> list = new ArrayList<Object>();
        List<?> list1 = new ArrayList<Number>();
        List<?> list2 = new ArrayList<Outer.Inner>();
        
    	// 类型通配符上限
        List< ? extends Number> list3 = new ArrayList<Number>();
        List< ? extends Number> list4 = new ArrayList<Integer>();
        
    	// 类型通配符下限
        List< ? super Number> list5 = new ArrayList<Number>();
        List< ? super Number> list6 = new ArrayList<Object>();
    }

可变参数

可变参数指参数个数可变,用作方法的形参出现,方法参数则可以为不定数量

  • 格式:修饰符 返回值类型 方法名( 数据类型 … 变量名 ){ } ,如( public static int sum( int … a ))

  • 可变参数变量其实是一个数组,如 int … a ,其实a就是一个int类型的不定长数组

  • 如果一个方法有多个参数,并且包含可变参数,那么可变参数要放在参数列表的最后面

public class Demo{
    public static void main(String[] args) {
        Demo.sum(1,2,3,4,5,6,7,8,9,10);	// 总数为:55
        Demo.sum("张三",true,1,2,3,4,5,6,7,8,9,10);	// 姓名为:张三	flag为:true	总数为:55
    }
    public static void sum(int ... a){	// 可变参数,int ... a 实际代表 a 为一个不定长整数数组
        int sum = 0;
        for (int i:a) {
            sum += i;
        }
        System.out.println("总数为:" + sum);
    }
    public static void sum(String name, boolean b,int ... a){	// 可变参数必须放在最后面
        int sum = 0;
        for (int i:a) {
            sum += i;
        }
        System.out.println("姓名为:" + name + "\tflag为:" + b + "\t总数为:" + sum);
    }

}

可变参数常用方法

  • Arrays工具类中的静态方法:public static < T > List < T > asList( T … a ):返回由指定数组支持的固定大小的列表
    • 该方法返回的集合不能做增删操作,可以做修改操作
  • List接口中的静态方法:public static < E > List < E > of ( E … elements ):返回包含任意数量元素的不可变列表
    • 该方法返回的集合不能做增删改操作
  • Set接口中的静态方法:public static < E > Set < E > of (E … elements):返回一个包含任意数量元素的不可变集合
    • 该方法返回的集合不能做增删操作,没有修改的方法,并且赋值时不能赋予重复值
public static void main(String[] args) {
        List<String> list = Arrays.asList("I","Love","Java");
        List<String> list1 = List.of("I", "Love", "Java");
        Set<String> list2 = Set.of("I", "Love", "Java");
    	// list.add() ,list.remove 这两种方法,三者都不能执行
    	// asList可以执行 list.set() 方法,List.of无法执行,Set.of没有该方法
    	// Set<String> list2 = Set.of("I", "Love", "Java","Java"); 是错误的,不能录入重复值
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的泛型(类,方法,接口)与可变参数 的相关文章

  • 看穿式监管来了

    收藏关注 台电脑登录 个账号 或者 个账号 台电脑同时登录 会有什么后果 根据监管部门 关于加强证券期货经营机构客户交易终端信息等客户信息管理的规定 关于进一步加强期货经营机构客户交易终端信息采集有关事项的公告 的要求 我司正式启动交易终端
  • Java之集合(15个demo)

    本节主要介绍java的集合 主要包括List Set和Map 其中List的子类ArrayList和LinkedList Set的子类HashSet和TreeSet Map的字类HashMap等 介绍了集合的常用方法 Collections
  • 面试必备之Java 最常见 200+ 面试题全解析

    这篇文章主要介绍了面试必备之Java 最常见 200 面试题全解析 老王觉得挺不错的 现在分享给大家 也给大家做个参考 给准备面试的大家 特别总结了 Java 程序员面试必备的面试题库 共含208道面试题 涵盖十九个模块 从 Java 基础
  • List中移除指定元素

    例一 想在list中删除元素 先看下面的这一段代码 public class App2 public static void main String args List
  • opencv图像处理(加法运算)

    加法运算 import os import re import cv2 cv2 imshow image img 显示 cv2 waitKey 10000 停留 cv2 destroyAllWindows 关闭 from PIL impor
  • 大数据-Linux的常用命令

    一 Linux的目录结构 1 标黄的是我们一般常用的 其他的作为了解就好 2 Linux的命令有很多 我只挑了一些和大数据相关的写一下 命令格式 command options parameter 说明 command 命令名 相应功能的英
  • android四大组件(详细总结)

    Android四大组件分别为activity service content provider broadcast receiver 一 android四大组件详解 1 activity 1 一个Activity通常就是一个单独的屏幕 窗口
  • springboot mybaties Invalid bound statement (not found) 错误

    错误信息 org apache catalina connector RequestFacade 5151cc1f org apache ibatis binding BindingException Invalid bound state
  • No module named ‘rospy‘

    1 rospkg未安装 pip install rospkg 或 conda install rospkg 2 rospkg已安装 参考 为pycharm设置搜索路径 sunshine drizzle的博客 CSDN博客 以下适用于 pyc
  • 补码的除法运算

    补码的除法运算是将两个数都使用补码的形式来进行计算 和原码的除法相比 补码的除法运算中被除数 除数以及余数都采用双符号位的形式参与计算 最后得到的余数符号位就代表着最终结果的符号位 加减交替法 题目 假设机器字长为5位 x 0 1000 y
  • C++类中的三大函数(构造,析构,拷贝)

    下面一段话与大家共勉 每个人的一生都会遇到很多边界 有些边界可以突破 有些则不能 那些无法突破的边界就是你的极限 而划分边界的标准就是 阈值 每次突破阈值之后 人生轨迹就会发生剧烈变化 其间需要你做出很多思考和判断 直到最后找到自己的极限
  • 类模板特例化

    参考来源 C primer 中文版第5版 P626 1 举个例子 为标准库hash模板定义一个特例化版本 可以用它来将Sales data对象保存在无序容器中 默认情况下 无序容器使用hash
  • Rancher持续集成部署K8S集群的脚本

    文章目录 1 概要 2 安装 2 1 Rancher CLI安装 2 2 kubectl 安装 3 Rancher CLI 配置API Key 3 1 添加API key 3 2 测试API key 3 3 配置部署镜像的脚本 3 3 1
  • gcc常用命令的使用

    一 简介 gcc提供了30多条警告信息和3个警告级别 使用它们有助于增强程序的稳定性和可移植性 此外 gcc还对标准的C和C 语言进行了大量的扩展 提高了程序的执行效率 有助于编译器进行代码优化 能够减轻编程的工作量 二 gcc常用的编译选
  • 高性能MySQL实战(一):表结构

    最近因需求改动新增了一些数据库表 但是在定义表结构时 具体列属性的选择有些不知其所以然 索引的添加也有遗漏和不规范的地方 所以我打算为创建一个高性能表的过程以实战的形式写一个专题 以此来学习和巩固这些知识 一 实战 我使用的 MySQL 版
  • 计算机外部设备IO接口

    计算机外部设备IO接口 常见接口 术语 常见接口 接口 特点 USB 通用串行总线 Universal Serial Bus 高速率 热插拔 雏菊链 最新版本 USB 4 SCSI 小型计算机系统接口 Small Computer Syst
  • rocketmq安装、启动

    1 下载 gt wget http mirror bit edu cn apache rocketmq 4 4 0 rocketmq all 4 4 0 source release zip gt unzip rocketmq all 4
  • 做一个合格的开发,从玩转Apipost开始

    前言 也是有一段时间没更文了 最近忙于跟生活对线 今天给大家带来的是一个宝贝 Apipost 这东西做啥用 这东西做啥用 这东西做啥用 这东西做啥用 在了解这个apipost的作用之前 先听我说 谢谢你因为有你 温暖了四季 身为后端研发的我
  • 全栈之前端

    关注回复 学习交流群 加入 安全开发运维 答疑交流群 原文连接 全栈之前端 2 CSS3基础知识之选择器学习本章将主要介绍CSS选择器类型 id 类 属性伪类和伪元素及关系选择器 它是CSS规则的第一部分 常常用于元素和其他部分组合起来告诉
  • 弹球小游戏

    创建loginBall类实现开始游戏界面 package 弹球小游戏 import javax swing import java awt public class loginBall JFrame JF new JFrame 弹球小游戏

随机推荐