Java泛型的定义与运用

泛型

泛型的作用从使用层面上来说是统一数据类型,防止将来的数据转换异常。从定义层面上来说,定义带泛型的类,方法等,将来使用的时候给泛型确定什么类型,泛型就会变成什么类型,凡是涉及到泛型的都会变成确定的类型,代码更灵活。

不使用泛型,少了限制,则在集合添加数据就不会类型异常的错误,导致运行结果出错。

java 复制代码
public class Test {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("1");
        list.add(666);
        list.add(true);
        for (Object o : list) {
            String s = (String) o;
            System.out.println(s.length());
        }
    }
}
  1. 泛型中的类型必须是引用类型
  2. 如果泛型不写,默认类型为Object

泛型的定义

含有泛型的类

new对象的时候确定类型,格式:

java 复制代码
public class 类名<E>{ }
java 复制代码
public class MyArrayList <E>{
    Object[] obj = new Object[5];//定义一个数组,充当ArrayList底层的数组,长度直接规定为10
    int size;
    public boolean add(E e){ //定义一个add方法,参数类型需要和泛型类型保持一致
        obj[size] = e;
        size++;
        return true;
    }
    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}
java 复制代码
public class Test {
    public static void main(String[] args) {
        Student<String> list1 = new Student<>();
        list1.add("张三");
        list1.add("李四");
        System.out.println(list1);//直接输出对象名,默认调用toString
        Student<Integer> list2 = new Student<>();
        list2.add(1);
        list2.add(2);
        System.out.println(list2);
    }
}

含有泛型的方法

调用的时候确定类型,其格式:

java 复制代码
修饰符 <E> 返回值类型 方法名(E e)
java 复制代码
public class Student {
    public static <E> void addAll(ArrayList<E> list, E...e){ //定义一个静态方法addAll,添加多个集合的元素,传入可变参数
        for (E element : e) {
            list.add(element);
        }
    }
}
java 复制代码
public class Test {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        Student.addAll(list1, "张三", "李四");
        System.out.println(list1);
        ArrayList<Integer> list2 = new ArrayList<>();
        Student.addAll(list2, 1, 2);
        System.out.println(list2);
    }
}

含有泛型的接口

格式:

java 复制代码
public interface 接口名<E>{  }

什么时候确定类型分两种,一种是在实现类的时候还没有确定类型,只能在new实现类的时候确定类型了,例如ArrayList。一种是在实现类的时候直接确定类型了比如Scanner。

java 复制代码
public interface MyList <E>{
    public boolean add(E e);
}
java 复制代码
public class MyArrayList<E> implements MyList<E>{
    Object[] obj = new Object[5];
    int size;
    public boolean add(E e){ //定义一个add方法,参数类型需要和泛型类型保持一致
        obj[size] = e;
        size++;
        return true;
    }
    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}
java 复制代码
public class Test {
    public static void main(String[] args) {
        MyArrayList<String> list = new MyArrayList<>();
        list.add("张三");
        list.add("李四");
        System.out.println(list);
    }
}

泛型通配符

泛型通配符使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。包括以下几类

E:Element (在集合中使用,因为集合中存放的是元素)

T:Type(Java 类)

K:Key(键)

V:Value(值)

N:Number(数值类型)

?:表示不确定的 java 类型

java 复制代码
public class Test {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("张三");
        list1.add("李四");
        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        test(list1);
        test(list2);
    }
    public static void test(ArrayList<?> list){ //?表示不确定的 java 类型
        for (Object o : list) {
            System.out.println(o);
        }
    }
}

泛型的上限下限

泛型的上下限可以规定泛型的范围

上限:?只能接收extends后面的本类类型以及子类类型

格式:<? extends 类型>

下限:?只能接收super后面的本类类型以及父类类型

格式:<? super 类型>

Integer的父类Number

Number的父类Object

相关推荐
Dovis(誓平步青云)3 分钟前
探索C++标准模板库(STL):String接口的底层实现(下篇)
开发语言·c++·stl·string
海棠一号8 分钟前
JAVA理论第五章-JVM
java·开发语言·jvm
eternal__day24 分钟前
Spring Cloud 多机部署与负载均衡实战详解
java·spring boot·后端·spring cloud·负载均衡
颜淡慕潇28 分钟前
Redis 实现分布式锁:深入剖析与最佳实践(含Java实现)
java·redis·分布式
程序员秘密基地34 分钟前
基于vscode,idea,java,html,css,vue,echart,maven,springboot,mysql数据库,在线考试系统
java·vue.js·spring boot·spring·web app
何中应36 分钟前
【设计模式-5】设计模式的总结
java·后端·设计模式
草莓熊Lotso36 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
海的诗篇_1 小时前
前端开发面试题总结-JavaScript篇(二)
开发语言·前端·javascript·typescript
吾日三省吾码1 小时前
Spring 团队详解:AOT 缓存实践、JSpecify 空指针安全与支持策略升级
java·spring·缓存
风象南1 小时前
SpringBoot的5种日志输出规范策略
java·spring boot·后端