JAVA基础之泛型(学习笔记)

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

一、泛型的概述

泛型,即"参数化类型"。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?

顾名思义,就是将原来具体的类型参数化,类似于方法中的参数, 然后在使用/调用时传入具体的类型(类型实参),Java中将类型也定义成参数形式的概念就叫做泛型。

泛型的作用是为了参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来达到:一次定义,多个用途。

泛型这种概念可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

Java中常用来表示泛型的通配符:

**`T :代表一般的任何类。`

`E :代表 Element 元素的意思,或者 Exception 异常的意思。`
`K :代表 Key 的意思。`
`V :代表 Value 的意思,通常与 K 一起配合使用。`
`S :代表 Subtype 的意思**

(一)、泛型类

java 复制代码
public class Generic<T> { 
    // key 这个成员变量的数据类型为 T, T 的类型由外部传入  
    private T key;
​
    // 泛型构造方法形参 key 的类型也为 T,T 的类型由外部传入
    public Generic(T key) { 
        this.key = key;
    }
    
    // 泛型方法 getKey 的返回值类型为 T,T 的类型由外部指定
    public T getKey(){ 
        return key;
    }
}

①在泛型类中,类型参数定义的位置有三处,分别为:

1.非静态的成员属性类型

2.非静态方法的形参类型(包括非静态成员方法和构造器)

3.非静态的成员方法的返回值类型

注意点:

1.泛型类中的静态方法和静态变量不可以使用泛型类所声明的类型参数(T)

(也就是对于静态的东西,不可以使用泛型,必须在初始化时就确定其具体类型)

2.泛型类中的类型参数(T)是在创建泛型类实例的时候确定的。

(例如 ArrayList< Integer >)。

3.在创建泛型类的对象时,必须指定类型参数 T 的具体数据类型,如果 <> 中什么都不传入,则默认是 < Object >。

②泛型类不只接受一个类型参数,它还可以接受多个类型参数。

java 复制代码
public class MultiType <E,T> {
    E value1;
    T value2;
    
    public E getValue1(){
        return value1;
    }
    
    public T getValue2(){
        return value2;
    }
}

(二)、泛型方法

1. 泛型方法的定义

当在一个方法签名中的返回值前面声明了一个 < T > 时,该方法就被声明为一个泛型方法。< T >表明该方法声明了一个类型参数 T,并且这个类型参数 T 只能在该方法中使用。当然,泛型方法中也可以使用泛型类中定义的泛型参数。

java 复制代码
public <类型参数> 返回类型 方法名(类型参数 变量名) {
    ...
}

注意点:

1.有在方法签名中声明了< T >的方法才是泛型方法,仅使用了泛型类定义的类型参数的方法并不是泛型方法。

java 复制代码
public class Test<U> {
    // 该方法只是使用了泛型类定义的类型参数,不是泛型方法
    public void testMethod(U u){
        System.out.println(u);
    }
    
    // <T> 真正声明了下面的方法是一个泛型方法
    public <T> T testMethod1(T t){
        return t;
    }
}
复制代码

2.泛型方法中可以同时声明多个类型参数。

java 复制代码
public class TestMethod<U> {
    public <T, S> T testMethod(T t, S s) {
        return null;
    }
}

3.泛型方法中也可以使用泛型类中定义的泛型参数。

java 复制代码
public class TestMethod<U> {
    public <T> U testMethod(T t, U u) {
        return u;
    }
}

4.特别注意的是 :泛型类中定义的类型参数和泛型方法中定义的类型参数是相互独立的,它们一点关系都没有.

java 复制代码
public class Test<T> {
	public void testMethod(T t) {
		System.out.println(t);
	}
	
	public <T> T testMethod1(T t) {
		return t;
	}
}

上示代码中,Test<T> 是泛型类,testMethod() 是泛型类中的普通方法,其使用的类型参数是与泛型类中定义的类型参数相同。

而 testMethod1() 是一个泛型方法,他使用的类型参数是与方法签名中声明的类型参数。

虽然上述泛型类中定义的类型参数标识和泛型方法中定义的类型参数标识都为<T>,但它们彼此之间是相互独立的。也就是说,泛型方法始终以自己声明的类型参数为准。

相关推荐
杨杨杨大侠8 小时前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
破茧蝴蝶8 小时前
Python分布式爬虫完整教程
开发语言·python
狗凯之家源码网8 小时前
全新 PHP 轻量客服聊天室源码深度评测
开发语言·php·聊天室系统
远离UE49 小时前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience9 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
Thinker QAQ9 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
栈帧之外10 小时前
【C++】STL之set
开发语言·c++
霸道流氓气质10 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python
AOI小白新手上路10 小时前
autodl常用的tar 打包下载(数据集)命令手册:逐段拆解与套用模板
java·大数据·数据库
catchadmin10 小时前
免费可商用 PHP 管理后台 CatchAdmin V5.4.1 发布,新增 MCP 支持
开发语言·php