首页 > 其他分享 >说⼀说你对泛型的理解

说⼀说你对泛型的理解

时间:2024-09-17 22:23:45浏览次数:13  
标签:通配符 public item 理解 泛型 new class

1.是什么

        泛型(Generics)是Java 5中引入的一个特性,它提供了编译时类型安全检查的机制,允许在编码阶段指定集合的元素类型或者方法的参数类型。使用泛型可以增强程序的可读性和安全性,避免在运行时出现类型转换异常。


1. 泛型的定义

泛型是通过类型参数来实现的,这些类型参数在类、接口或方法的定义中使用一对尖括号(<>)指定。


2. 泛型的优点

  • 类型安全:泛型可以保证在编译时期就能检查出非法的类型转换,而不是在运行时抛出ClassCastException
  • 消除强制类型转换:使用泛型后,可以减少代码中的类型转换操作,使得代码更加简洁。
  • 代码复用:通过泛型,可以编写适用于多种数据类型的类或方法。

3. 泛型的使用示例

泛型类
public class Box<T> {
    private T t; // T stands for "Type"
    
    public void set(T t) {
        this.t = t;
    }
    
    public T get() {
        return t;
    }
}

在这个例子中,Box是一个泛型类,它有一个类型参数T。这个T可以在实例化Box类的时候指定。

泛型方法
public class Util {
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getKey().equals(p2.getKey()) &&
               p1.getValue().equals(p2.getValue());
    }
}

public class Pair<K, V> {
    private K key;
    private V value;
    
    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }
    
    public K getKey() { return key; }
    public V getValue() { return value; }
}

这里Util类中的compare方法是一个泛型方法,它接受两个Pair类型的参数,并比较它们的键和值。


4. 泛型的类型限定

有时候,你可能希望限制泛型可以接受的类型。这可以通过类型限定来实现。

public class Plate<T extends Fruit> {
    private T item;
    
    public Plate(T item) {
        this.item = item;
    }
    
    public void set(T item) {
        this.item = item;
    }
    
    public T get() {
        return item;
    }
}

在这个例子中,Plate类只能接受Fruit类或其子类的实例。


5. 泛型的通配符

泛型的通配符?用于表示未知类型,主要有三种使用方式:

  • <?> 无限定通配符
  • <? extends T> 上限通配符
  • <? super T> 下限通配符
public class Fruit {}
public class Apple extends Fruit {}

public class Test {
    public static void main(String[] args) {
        List<Apple> apples = new ArrayList<>();
        List<Fruit> fruits = new ArrayList<>();
        
        // 使用上限通配符
        fruits.add(new Fruit());
        apples.add(new Apple());
        fruits = apples; // 编译错误,因为List<Apple>不是List<Fruit>的子类型
        fruits = new ArrayList<Fruit>(); // 正确
        
        // 使用下限通配符
        List<? super Apple> list = new ArrayList<Fruit>();
        list.add(new Apple()); // 正确
        // list.add(new Fruit()); // 编译错误,因为Fruit不是Apple的父类
    }
}

泛型是Java语言中一个强大而灵活的特性,合理使用泛型可以使代码更加健壮和易于维护。

标签:通配符,public,item,理解,泛型,new,class
From: https://blog.csdn.net/2401_83418369/article/details/142320018

相关文章

  • Vue.js入门系列(三十):深入理解独享路由守卫、组件内路由守卫、History模式与Hash模式
    个人名片......
  • 伏秒平衡的深入理解
    一、基本概念伏秒平衡的本质是能量守恒。在开关电源中,电感元件在导通和关断期间会分别储存和释放能量。伏秒平衡原则指出,在稳态工作的开关电源中,电感两端的正伏秒值(即电感在导通期间电压与时间的乘积)等于负伏秒值(即电感在关断期间电压与时间的乘积)。这意味着电感在每个开关周......
  • go使用泛型实现接口通用结构体转换
    packagepagemodelimport("gitee.com/leijmdas/gobase/goconfig/common/base/basedto""gitee.com/leijmdas/gobase/goconfig/common/base/baseiface""gitee.com/leijmdas/gobase/goconfig/common/base/jsonutils""......
  • 【JavaEE】——线程的诞生(超详细、易理解)
    一:进程对内存的管理1:进程的独立性:进程是如何管理内存的,核心:每个进程都有一块独立的内存,进程与进程之间的内存互不干扰,通常情况下,进程A的内存不能访问进程B的内存好处“进程独立性”:如果进程A的内存超出了给分配的内存大小(即内存越界)或者出现某些bug导致进程A挂掉,不会影响到......
  • 图文深入理解Oracle体系结构之内存篇
    前面在Oracle体系结构概述篇中总体介绍了Oracle的体系结构,接下来分别详细深入介绍其组成部分的各个模块的功能与作用,本篇先深入内存部分。一.先上图:OracleDB内存结构图OracleDB实例的两大基本内存结构(也有的说三大:SGA/PGA/UGA,但是UGA基本包含于SGA(共享服务器模式)或......
  • 【Java】深入理解Java中的多线程同步机制
    一、多线程的数据不一致    当多个线程同时运行时,线程的调度由操作系统决定,程序本身无法决定。因此,任何一个线程都有可能在任何指令处被操作系统暂停,然后在某个时间段后继续执行。    这个时候,一个在单线程模型下不存在的问题就会发生:如果多个线程同时读写共享......
  • 深入理解Python生成器、装饰器和异常处理
    一、Python生成器1.1什么是生成器?生成器(Generator)是Python中一种特殊的迭代器,它允许你在遍历大型数据集时节省内存。与普通函数不同,生成器函数使用yield关键字返回值,而不是return。生成器每次被调用时,函数的执行会在yield语句处暂停,并保存函数的状态,下一次再调用时从上次......
  • 关于码元 带宽 传输速率 奈奎斯特定理的理解
    首先是码元,码元代表的是固定时长的信号波形表示一位k进制数字,尤其注意可以是半个周期,也可以是数个周期,只需要注意是在固定时长就行,不与频率有直接关系,只要在带宽频率所显示的范围内并且可以被准确检测到数据就行。带宽,带宽应为能收到的最快频率和最慢频率的差值,单位为HZ。传输速......
  • 泛型
    泛型是一种类型参数。将数据的类型,当做一个参数。1.泛型的作用在创建集合对象的时候,限定集合存储元素的类型;在编译的时候,就进行类型检查;2.泛型的使用规则如果不指定泛型,默认是Object类型泛型擦除:泛型应用于代码编译期,程序运行的后,泛型就被擦除了。即运行期,泛型被擦......
  • 松理解数据库并发调度与可串行性
    ‍前言在数据库系统中,多个事务的并发执行是不可避免的。然而,并发执行可能导致数据不一致的情况。为了解决这个问题,数据库管理系统(DBMS)使用调度策略来控制事务的执行顺序。本文将简洁地介绍可串行化调度这一概念,帮助你理解如何确保多个事务的并发执行不会导致数据错误。......