JAVA【泛型】详解

本文详细介绍了Java中的泛型,包括泛型的本质——类型参数化,泛型的意义,如何定义泛型类、泛型方法和泛型接口。还讨论了泛型通配符、上下限以及Java泛型的类型擦除特性,强调了泛型在编译阶段的有效性和对基础类型的支持限制。

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


什么是泛型

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


泛型的意义

一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。


泛型的定义

在这里插入图片描述


1.泛型类

在这里插入图片描述

写一个泛型类

import java.util.ArrayList;

public class Test {
    //泛型类
    static class MyArrayList<E> {
        private ArrayList lists = new ArrayList();

        public void add(E e){
            lists.add(e);
        }

        public void remove(E e){
            lists.remove(e);
        }

        @Override
        public String toString(){
            return lists.toString();
        }
    }

    public static void main(String[] args) {
        //模拟一个ArrayList定义一个MyArrayList<>,理解泛型设计
        //String
        MyArrayList<String> list = new MyArrayList<>();
        list.add("JAVA");
        list.add("肥皂");
        list.add("go");
        System.out.println(list);
        list.remove("go");
        System.out.println(list);

        //Integer
        MyArrayList<Integer> list2 = new MyArrayList<>();
        list2.add(10);
        list2.add(5);
        list2.add(1);
        System.out.println(list2);
        list2.remove(10);
        System.out.println(list2);
    }
}

查看输出:
在这里插入图片描述


2.泛型方法

在这里插入图片描述

泛型方法的原理: 把出现泛型变量的地方全部替换成传输的真实数据类型。

public class Test {
    public static void main(String[] args) {
        String[] names = {"肥皂","幽灵","普莱斯"};
        printArray(names);

        Integer[] ages = {20,30,40};
        printArray(ages);
    }

    //泛型方法
    public static <T> void printArray(T[] arr){
        if(arr !=null){
            StringBuilder sb = new StringBuilder("[");
            for(int i=0; i < arr.length; i++){
                sb.append(arr[i]).append(i ==arr.length - 1?"":",");
            }
            sb.append("]");
            System.out.println(sb);
        }else{
            System.out.println(arr);
        }
    }
}

查看输出:
在这里插入图片描述


3.泛型接口

在这里插入图片描述

泛型接口可以约束实现类,实现类可以在实现接口的时候传入自己操作的数据类型这样重写的方法都将是针对于该类型的操作。

//学生类
public class Student {
}
//泛型接口
public interface Data <E>{
    void add(E e);
    void delete(int id);
    void update(E e);
    E queryById(int id);
}
//实现接口并使用学生类型
public class StudentData implements Data<Student>{

    @Override
    public void add(Student student) {

    }

    @Override
    public void delete(int id) {

    }

    @Override
    public void update(Student student) {

    }

    @Override
    public Student queryById(int id) {
        return null;
    }
}

泛型通配符

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

为什么报错?因为在这里插入图片描述

在这里插入图片描述

提出问题:不让Dog进来该如何做

泛型上下限

在使用泛型的时候,我们可以为传入的泛型类型实参进行上下边界的限制,如:类型实参只准传入某种类型的父类或某种类型的子类。
在这里插入图片描述

由泛型上下限得出解决办法:

在这里插入图片描述


Java中的泛型是伪泛型的解释

泛型中类型擦除 Java泛型这个特性是从JDK 1.5加入的,为了兼容之前的版本,Java泛型的实现使用“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样。因此泛型只在编译阶段有效。


总结

数组不支持泛型。
泛型的类型不能为基础数据类型,比如不能用int但可以用Integer。
泛型只在编译阶段有效。

《Java 编程思想》
《Java核心技术 卷1》
《黑马程序员》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值