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 某一个类

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

相关推荐
yaaakaaang4 小时前
十三、责任链模式
java·责任链模式
爱吃烤鸡翅的酸菜鱼4 小时前
【Java】封装位运算通用工具类——用一个整数字段替代几十个布尔列,极致节省存储空间
java·开发语言·设计模式·工具类·位运算·合成复用原则
菜菜小狗的学习笔记4 小时前
八股(三)Java并发
java·开发语言
云烟成雨TD5 小时前
Spring AI Alibaba 1.x 系列【10】ReactAgent 工具加载和执行流程
java·人工智能·spring
lee_curry5 小时前
JUC第一章 java中基础概念和CompletableFuture
java·多线程·并发·juc
迷藏4945 小时前
**超融合架构下的Go语言实践:从零搭建高性能容器化微服务集群**在现代云原生时代,*
java·python·云原生·架构·golang
それども5 小时前
Spring Bean @Autowired自注入空指针问题
java·开发语言·spring
如来神掌十八式5 小时前
Java所有的锁:从基础到进阶
java·
硅基诗人5 小时前
Java后端高并发核心瓶颈突破(JVM+并发+分布式底层实战)
java·jvm·分布式
聆听。。花开雨落5 小时前
intelij idea闪退后再启动tomcat报错端口冲突
java·tomcat·intellij-idea