泛型

1、Object类

在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本身就是一个安全隐患。

2、泛型

也是实现参数类型的任意化,但是在编译的时候能够检查类型安全,并且所有的强制转换都是自动和隐式的。

 

一、通配符和类型限定

通配符【?】

  • 表示不确定的 java 类型;一般是用作<? extends 具体类型>或者<? super 具体类型>

  • 通配符只允许出现在引用中(普通变量引用、形参),不允许出现在泛型定义中(泛型类、泛型接口、泛型方法的< >里)

类型限定【T、K、V、E】

  • 约定俗称的东西,并不是java中规定的,可以换成任意一个字母,但是可读性会变差;用来表示泛型

  • T (type) 表示具体的一个java类型

  • K、V (key value) 分别代表java键值中的Key Value

  • E (element) 代表Element

区别:

1、“T”和“?”运用的地方不同:“?”是定义在引用变量上,“T”是类上或方法上。

2、类型限定只有<T extends 数据类型> ,只能设定上边界,而通配符既可以设定上边界<? extends 数据类型>也可以设定下边界<? super 数据类型>

https://blog.csdn.net/a18615971648/article/details/115799984

二、泛型接口

Java接口使用泛型,有两种方式:

  • 第一种在实现接口的子类依旧使用泛型,在实例化的时候在动态添加type

  • 第二种形式,子类实现接口的时候具体化type,在实例化的时候不用再动态添加type

复制代码
//接口泛型
interface Message<T>{
    public void isit(T t);
}

class MessageTwo<T> implements Message<T>{//第一种在实现接口的子类依旧使用泛型,在实例化的时候在动态添加type
    public void isit(T t){
        System.out.println(t.toString());
    }
}

class MessageThree implements Message<String>{//第二种形式,子类实现接口的时候具体化type,在实例化的时候不用再动态添加type
    public void isit(String t){
        System.out.println(t.toString());
    }
}
复制代码

三、泛型类

类级别上使用泛型,允许在类中的多个地方使用同一类型参数。

  • 泛型类使用:在类名后面添加类型参数声明的类,在实例化类的时候指明泛型的具体类型。它允许类操作不同类型的对象,同时保持类型安全。泛型类的定义格式如下

public class ClassName<T> {
    // 类体
}
//泛型类的实例化时,需要指定具体的类型参数:
ClassName<String> instance = new ClassName<>(); 
//这里,<String> 指定了 T 为 String 类型。

四、泛型方法

方法级别上使用泛型,为方法调用提供更大的灵活性。

  • 泛型方法使用:泛型方法是在方法返回类型之前声明类型参数的方法,在调用方法的时候指明泛型的具体类型。泛型方法允许在调用方法时指定不同的类型参数,从而使得一个方法可以在多种类型上操作,同时保持类型安全。泛型方法的定义格式如下

复制代码
public <T> T methodName(T param) {
    // 方法体
}
//<T>:类型参数声明,表示这是一个泛型方法。
//T:返回类型,表示这个方法将返回一个 T 类型的对象。
//param:参数,类型为 T。
//泛型方法的调用不需要指定类型参数,编译器会根据传入的参数类型自动推断
methodName("Hello, World!");
//在这个例子中,编译器会推断 T 为 String 类型。
复制代码

可以定义在普通类中,也可以定义在泛型类中,即泛型方法的类型参数和泛型类的类型参数没有必然联系。泛型类和泛型方法都是泛型编程的重要组成部分,它们提高了代码的复用性和安全性。

 
posted @   zhegeMaw  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示