JAVA-泛型一{泛型}JAVA从基础开始 --5

本文深入讲解Java泛型的概念、使用方法及其优势。介绍如何利用泛型提高代码的可读性和安全性,涵盖泛型类、接口及方法等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

泛型概念

泛型是JDK1.5(5.0)以后増加的,它可以帮助我们建立类型安全的集合。
泛型的本质就是“数据类型的参数化”,处理的数据类型不是固定的,而是可以作为参数传入。我们可以把“泛型”理解为数据类型的一个占位符(类似:形式参数),即告诉编译器,在调用泛型时必须传入实际类型。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

使用

1.把类型当做参数来使用
2.参数类型只能是引用值

优点

在不使用泛型的情况下,我们可以使用Object类型来实现任意的参数类型,但是在使用时需要我们强制进行类型转换。这就要求程序员明确知道实际类型,不然可能引起类型转换错误;但是,在编译期我们无法识别这种错误,只能在运行期发现这种错误。使用泛型的好处就是可以在编译期就识别出这种错误,有了更好的安全性;同时,所有类型转换由编译器完成,在程序员看来都是自动转换的,提高了代码的可读性
,就是使用泛型主要是两个好处:
◆代码可读性更好【不用强制转换】
◆程序更加安全【只要编译时期没有警告,运行时期就不会出现 Classcast Exception异常】

类型擦除

泛型主要用于编译阶段,会在编译时把泛型擦除。
在编译后,会被替换成Object,运行时虚拟机并不知道泛型
主要是为了代码的编写方便以及安全性的检查

泛型使用

数据类型的占位符
可以使用任何字符,一般使用:E、T、K、V、N、?

泛型标记对应单词说明
EElement表示容器中使用表示容器中的元素
TType表示普通的JAVA类
KKey表示健 如 Map中的健Key、
VValue表示值
NNumber表示数值类型
?表示不确定JAVA的类型

泛型类

把泛型定义在类上,在使用的时候才把类型确认下来,类名称后添加一个或多个类型参数声明< T >、 <T、K、V>

package main;

public class MyGenerics<T> {
    private T flag;

    public void setFlag(T flag) {
        this.flag = flag;
    }

    public T getFlag() {
        return this.flag;
    }
}

test

package main;

public class Test {
    public static void main(String[] args) {
        MyGenerics<String> objectMyGenerics = new MyGenerics<>();
        objectMyGenerics.setFlag("123");
        System.out.println(objectMyGenerics.getFlag() + 1);

        MyGenerics<Integer> objectMyGenerics1 = new MyGenerics<>();
        objectMyGenerics1.setFlag(123);
        System.out.println(objectMyGenerics1.getFlag() + 1);
    }
}

在这里插入图片描述
//可以在使用改类时候,再定义类的类型

泛型接口

package main;

public interface IGeneric<T> {
    T getName(T name);
}

实现类

package main;

public class IGenericImpl implements IGeneric<String> {//给定具体类型

    @Override
    public String getName(String name) {
        return null;
    }
}

在这里插入图片描述
在这里插入图片描述

泛型方法

是指将方法的参数类型定义为泛型,方便在调用的时候接受不同的参数,可有多个

package main;

public class MethodGeneric {

    public <T> void setName(T name) {
        System.out.println(name);
    }

    public <T> T setTName(T name) {
        System.out.println(name);
        return name;
    }
}
package main;

public class Test03 {
    public static void main(String[] args) {
        MethodGeneric methodGeneric = new MethodGeneric();
        methodGeneric.setName(2234);
        methodGeneric.setName("thing");

        methodGeneric.setTName("113");
        methodGeneric.setTName(1111);
    }
}

可以看到 我们可以直接传任意类型参数,并且都正常运行

静态方法泛型

静态泛型中,不允许使用类定义的泛型。

在这里插入图片描述

   public static <T> void setstr(T str) {
        if (str instanceof String) {
            System.out.println(str + " is a String");
        } else {
            System.out.println(str + " not a String");
        }
    }
package main;

public class Test04 {
    public static void main(String[] args) {
        MethodGeneric.setstr("张三");
        MethodGeneric.setstr(111);
    }
}

在这里插入图片描述

泛型方法可变参数


    public <T> void method(T...args){
        for(T t:args){
            System.out.println(t);
        }
    }    
package main;

public class Test05 {
    public static void main(String[] args) {
        MethodGeneric methodGeneric = new MethodGeneric();
        String[] arr = new String[]{"a", "b", "c"};
        Integer[] arr1 = new Integer[]{1, 2, 3};
        methodGeneric.method(arr);
        methodGeneric.method(arr1);
    }
}

所以,无论是传入String数组还是Integer数组,可以正常使用

全文件下载 0积分

链接: java基础泛型 学习全文件.

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻动琴弦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值