Java 基础进阶篇(十)—— 泛型与可变参数

这篇具有很好参考价值的文章主要介绍了Java 基础进阶篇(十)—— 泛型与可变参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、泛型概述

泛型是 JDK5 中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。

格式:<数据类型>;

好处:统一数据类型。把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。

注意:泛型只能支持引用数据类型。集合体系的全部接口和实现类都是支持泛型的使用的。


二、泛型的定义

泛型可以在很多地方进行定义:

  • 类后面 泛型类
  • 方法申明上 泛型方法
  • 接口后面 泛型接口

2.1 泛型类

定义类时同时定义了泛型的类就是泛型类。

格式:修饰符 class 类名<泛型变量> { ... }

作用:编译阶段可以指定数据类型,类似于集合的作用。

Java 基础进阶篇(十)—— 泛型与可变参数
注:此处泛型变量 T 可以随便写为任意标识,常见的如E、T、K、V等。

public class MyArrayList<T> {
    private ArrayList<T> list = new ArrayList<>();
    
    public void add(T t){
        list.add(t);
    }
    public void remove(T t){
        list.remove(t);
    }
}

2.2 泛型方法

定义方法时同时定义了泛型的方法就是泛型方法。

格式:修饰符 <泛型变量> 方法返回值 方法名称(形参列表){...}

作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。

Java 基础进阶篇(十)—— 泛型与可变参数

public static <T> void printArray(T[] arr){
    if(arr != null){
        StringBuilder builder = new StringBuilder("[");
        for (int i = 0; i < arr.length; i++) {
            builder.append(arr[i]).append(i == arr.length - 1 ? "" : ", ");
        }
        builder.append("]");
        System.out.println(builder);
    }else {
        System.out.println(arr);
    }
}

2.3 泛型接口

使用了泛型定义的接口就是泛型接口。

格式:修饰符 interface 接口名称<泛型变量>{...}

作用:泛型接口可以约束实现类,泛型接口可以让实现类选择当前功能需要操作的数据类型。

Java 基础进阶篇(十)—— 泛型与可变参数

原理:实现类可以在实现接口的时候传入自己操作的数据类型这样重写的方法都将是针对于该类型的操作。

案例:教务系统,提供一个接口可约束一定要完成数据(学生,老师)的增删改查操作。

public interface Data<E> {
    void add(E e);
    void delete(int id);
    void update(E e);
    E queryById(int id);
}
public class Student {
	...
}

public class StudentData implements Data<Student>{
    @Override
    public void add(Student student) {
    }

    @Override
    public void delete(int id) {
    }

    @Override
    public void update(Student student) {
    }

    @Override
    public Student queryById(int id) {
        return null;
    }
}

public class Teacher {
	...
}

public class TeacherData implements Data<Teacher>{
    @Override
    public void add(Teacher teacher) {
    }

    @Override
    public void delete(int id) {
    }

    @Override
    public void update(Teacher teacher) {
    }

    @Override
    public Teacher queryById(int id) {
        return null;
    }
}

三、泛型深入

3.1 泛型通配符

通配符:?,其可以在 使用泛型 的时候代表一切类型。

注:E T K V 是在 定义泛型 的时候使用的。


3.2 泛型上下限

泛型上限:? extends Car,? 必须是 Car 或者其子类。
泛型下限:? super Car,? 必须是 Car 或者其父类。


3.3 案例:定义一个 “所有车量进行比赛” 的方法

需求:定义一个 “所有车进行比赛” 的方法,该方法参数只可接收汽车类型的集合,其中汽车的父类和子类如下:

class Car{
}
class BENZ extends Car{
}
class BMW extends Car{
}

试想 1:如果参数为泛型方式,则任何类的集合都可作为参数,这是错误的。

public static void go(ArrayList<T> cars){

}

试想 2:如果设置参数为父类类型,也是会存在问题:虽然 BMW 和 BENZ 都继承了 Car 但是 ArrayList<BMW>、ArrayList<BENZ>、 ArrayList<Car>没有关系的。

public static void go(ArrayList<Car> cars){

}

因此,可采用“泛型上限” 的方式解决此问题。客户端模拟代码如下:

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<BMW> bmws = new ArrayList<>();
        bmws.add(new BMW());
        bmws.add(new BMW());
        bmws.add(new BMW());
        go(bmws);

        ArrayList<BENZ> benz = new ArrayList<>();
        benz.add(new BENZ());
        benz.add(new BENZ());
        benz.add(new BENZ());
        go(benz);
    }

    // 所有车比赛
    public static void go(ArrayList<? extends Car> cars){

    }
}

四、可变参数

可变参数用在形参中可以接收多个数据。

格式:数据类型...参数名称

作用:接收参数非常灵活方便。可以不接收参数,可以接收一个或者多个参数,也可以接收一个数组。

可变参数在方法内部本质上就是一个数组

注意:一个形参列表中可变参数只能有一个;可变参数必须放在形参列表的最后面

举例:假如需要定义一个方法求和,求和数字个数不确定。

public static void main(String[] args) {
	System.out.println(getAll()); // 0
	System.out.println(getAll(10)); // 10
	System.out.println(getAll(10, 20, 30)); // 60
	System.out.println(getAll(new int[]{10, 20, 30, 40, 50})); // 150
}

/**
  注意:一个形参列表中只能有一个可变参数,可变参数必须放在形参列表的最后面
  */
public static int getAll(int... nums){
	int co = 0;
	for (int i = 0; i < nums.length; i++) {
		co += nums[i];
	}
	return co;
}

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)文章来源地址https://www.toymoban.com/news/detail-436158.html

到了这里,关于Java 基础进阶篇(十)—— 泛型与可变参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++进阶】C++11(下)可变参数模板&lambda表达式&包装器

    我们紧接着上一节的讲解来进行 C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧

    2024年04月11日
    浏览(69)
  • Java 基础进阶篇(十七):反射概述及获取对象的方式

    反射是指对于任何一个Class类,在 “运行的时候”,不用创建对象,就可以直接得到这个类全部成分。 在运行时,可以直接得到这个类的构造器对象:Constructor 在运行时,可以直接得到这个类的成员变量对象:Field 在运行时,可以直接得到这个类的成员方法对象:Method 这种

    2024年02月07日
    浏览(29)
  • java 可变参数 详解(通俗易懂)

    目录 一、概述: 二、格式: 三、注意事项(使用规范): 四、代码演示:         演示规范①~③:         演示规范④:         演示规范⑤:         课堂练习:         代码演示:         输出结果: 五、英文版本讲解:         java中,我们可以将 名称相同,

    2024年01月22日
    浏览(27)
  • java -- Map接口和可变参数

    Map: 映射, 是双列集合顶层接口 java.util.Mapk,v k: key 键 唯一 v: value 值 可重复 底层数据结构: 链表 + 哈希表 链表保证元素有序 哈希表保证元素唯一 java.util.TreeMap 底层数据结构是红黑树 键 排序 具有唯一性 不允许null键 允许null值 在 JDK1.5 之后,如果我们定义一个方法需要接受多

    2023年04月11日
    浏览(58)
  • C#泛型进阶:深入解析类型参数约束,优化代码安全性与灵活性

    概述: C#泛型类型参数约束提供了灵活的方式,确保泛型代码满足特定条件。从值类型、引用类型、构造函数到基类、接口等多重约束,为泛型设计提供了更多限制和设计选择。可空参数约束进一步增强了泛型的适用性。这些约束提高了代码的类型安全性和可读性,为开发者

    2024年02月03日
    浏览(78)
  • GO基础进阶篇 (十三)、泛型

    先看一下这段代码。 上面的代码中,我们想要打印参数arr的信息。运行报错 想要解决的话,按照之前我们的学习,可以将函数改编如下(使用断言) 但这样会有一个坏处,当我们想要打印另一个非string的数组时,就不得不再写一个方法 这样处理,就会导致有无限多相似的代

    2024年01月18日
    浏览(33)
  • 2023.8 - Java - Java可变参数(variable arguments)

    类似于 javascript 的 剩余运算符; 方法中只能有一个可变参数(变量参数)。 Java可变参数必须是最后一个参数。

    2024年02月11日
    浏览(22)
  • 【JavaSE】Java进阶知识一(泛型详解,包括泛型方法,协变,逆变,擦除机制)

    目录 泛型 1. 什么是泛型 2.泛型方法 3.通配符上界(泛型的协变) 4.通配符下界(泛型的逆变) 5.泛型的编译(擦除机制)         泛型:就是让一个类能适用于多个类型,就是在封装数据结构时能让封装的类型被各种类型使用所以引入了泛型的概念,虽然有了泛型,什么数

    2024年02月04日
    浏览(35)
  • Java泛型:灵活多变的类型参数化工具

    👑专栏内容:Java ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 在传统的编程方法中,类和方法通常被限定为使用特定的类型。这些类型可能是基础的数据类型(如整数、字符等),或者是由程序员自己定义的复杂类型。这种方式在处理单一类型数据时很有

    2024年02月01日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包