java 泛型

  1. 概述
    泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。

泛型,就是类型参数。

一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。

那么类型参数理解呢?

顾名思义,就是将原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

举个例子:

cpp 复制代码
Arraylist<String> list =new ArrayList<>();

String 就是确定了list中元素类型只能是String,其他类型只能会编译器报错。

泛型的本质是为了参数化类型,(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。

也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

2.简单泛型类

就是具有几个泛型变量的类

例如:一个泛型变量T(泛型变量的个数是指尖括号中的泛型个数)

cpp 复制代码
public class Pair<T>
{
	private T first;
	
	private T second;

    public T getFirst() {
        return first;
    }

    public void setFirst(T first) {
        this.first = first;
    }
       public T getSecond() {
        return second;
    }

    public void setSecond(T second) {
        this.second = second;
    }
    
    public Pair(T first, T second) {
        this.first = first;
        this.second = second;
    }

}

泛型类也可以有多个类型泛型变量,例如,

cpp 复制代码
public class Pair<T,U>
{

	...
}

用具体的类型替换泛型变量就可以实例化简单泛型类,例如:

cpp 复制代码
Pair<String>

3.泛型简单方法

cpp 复制代码
class ArrayALg{
   public static <T> T getMiddle(T... a){
        return a[a.length/2];
    }
}

这个方法是在一般类中定义的,泛型变量<T>放在 public static 后面。返回类型之前。

调用泛型方法时候,可以省略泛型的参数,编译器会从其他信息中去获取这个泛型是什么数据类型。

cpp 复制代码
String middle=ArrayALg.getMiddle("a","b","c");

哪里用到了泛型,编译器会得到这个泛型的具体信息。

4.泛型变量限定

这个是计算最小值

cpp 复制代码
public static <T> T min(T[] a)
{
	if(a==null || a.length==0)return null;
	T smallest =a[0];
	for(int i=1;i<a.length;i++)
	{
		if(smallest.compareTo(a[i]>0))
			{
			smallest=a[i];
			}
	return samllest;
	}
}

这个是比较数值,但是泛型是T,表示任何一个类的对象。那怎么去限制T的类型范围?

用关键字extends

将T的范围限制在Comparable接口

cpp 复制代码
public static <T extends Comparable> T min(T[] a)...

一个泛型变量或通配符可以有很多个限定,例如:

cpp 复制代码
T extends Comparable & Serializable

限定类型用&分隔,而逗号来分隔泛型变量

5.泛型通配符

01.? extends 某一个类

举个例子:

cpp 复制代码
public static void test(Pair<Employee> p)
{
	Employee first=p.getFirst();
	Employee second=p.getSecond();
	System.out
}

02.? super 某一个类

限制泛型是某一个类的超类(父类)。

相关推荐
程序员小假2 分钟前
你分得清 Prompt、Agent、Function Call、Skill、MCP 吗?
java·后端
xuboyok26 分钟前
【Spring Boot】统一数据返回
java·spring boot·后端
亚马逊云开发者8 分钟前
你的 AI Agent 只有鱼的记忆?聊聊 Agent 记忆管理的正确姿势
java
燕山罗成30 分钟前
JAVA多线程基础
java·开发语言
予枫的编程笔记32 分钟前
【面试专栏|Java并发编程】拆解Java线程生命周期:从新建到终止,再讲清进程与线程的核心差异
java·多线程·java基础·java面试·进程与线程·面试干货·java线程生命周期
Yvonne爱编码43 分钟前
JAVA数据结构 DAY7-二叉树
java·开发语言·数据结构
程序媛徐师姐44 分钟前
Java基于微信小程序的球馆预约系统,附源码+文档说明
java·微信小程序·球馆预约系统小程序·jav球馆预约系统小程序·java球馆预约微信小程序·球馆预约微信小程序·java球馆预约系统
于先生吖1 小时前
2026 新版 Java 同城上门家政服务系统源码 完整可运营
java·开发语言
gp3210261 小时前
什么是Spring Boot 应用开发?
java·spring boot·后端
happymaker06261 小时前
JDBC(MySQL)——DAY04(调用存储过程,存储函数)
java·数据库·mysql