JAVA泛型的继承和实现、擦除原理解析

JAVA泛型的继承和实现

在Java中,泛型具有继承和实现的特性,并且是协变的。这意味着如果一个类A继承自类B,那么从类B继承下来的所有泛型类型,都可以在类A中使用。下面以一个例子来说明:

public class Animal {

}

public class Cat extends Animal {

}

public class Box<T> {
    private T t;

    public Box(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}

public class CatBox extends Box<Cat> {
    public CatBox(Cat cat) {
        super(cat);
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Cat cat = new Cat();

        CatBox catBox = new CatBox(cat);

        // 父类引用指向子类对象
        Box<Animal> animalBox = catBox;

        Animal animalFromBox = animalBox.get(); // 因为泛型类型协变,所以可以返回Animal类型

        System.out.println(animalFromBox.getClass().getSimpleName()); // 输出 Cat
    }
}

上面的例子中,我们定义了一个Box类,该类使用泛型T来表示存储的对象的类型。然后,我们定义了一个CatBox类,它继承自Box,即存储的对象类型是Cat。最后,我们定义了一个父类Box的引用,指向CatBox对象。由于泛型类型是协变的,Box可以指向Box,因此我们可以从Box中获取一个Animal对象,该对象实际上是Cat类型,因为我们从CatBox中获取的实际上是一个Cat类型的对象。这说明了Java泛型是具有继承特性的。

擦除原理解析

Java泛型的实现是通过类型擦除来实现的。类型擦除是在编译期间实现的,具体实现方式是将所有泛型类型替换为它们的边界类型或Object类型,并插入必要的强制类型转换。下面通过两个示例来说明:

示例一

public class Box<T> {
    private T t;

    public void set(T t){
        this.t = t;
    }

    public T get() {
        return t;
    }

    public static void main(String[] args) {
        Box<Integer> box = new Box<>();
        box.set(10);
        int i = box.get(); // 此处实际上还需要进行类型转换为 int,但由于自动拆箱,因此可以忽略

        System.out.println(i);
    }
}

在上面的示例中,我们定义了一个Box类,该类使用泛型T来表示存储的对象的类型。然后,我们在main方法中创建了一个Box,并存储了一个整数10。在获取整数时,我们从Box中获取,但实际上泛型类型T被擦除后变成了Object类型,因此需要进行一次类型转换为int类型,但由于自动拆箱,因此可以省略类型转换。

示例二

public class Test {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        System.out.println(list1.getClass().equals(list2.getClass())); // true
    }
}

在上面的示例中,我们定义了两个不同类型的List:一个是存储String类型的List,一个是存储Integer类型的List,两个List对象的Class类型是相同的,这是由于Java泛型使用了类型擦除所导致的,泛型类型T被擦除后,实际上变成了相同的原始类型。这也是为什么在Java泛型中,无论是List还是List,都可以被赋值给List的原因之一。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA泛型的继承和实现、擦除原理解析 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 【sping揭秘】22、事务管理

    Spring框架提供了强大的事务管理功能,可以帮助我们管理数据库事务,确保数据的一致性和完整性。本文将介绍Spring事务管理的完整攻略,包括事务管理的概念、使用方法和示例说明。 事务管理的概念 事务是指一组操作,这些操作要么全部成功,要么全部失败。在数据库中,事务通常用于管理对数据库的修改操作,例如插入、更新和删除数据。事务管理是指在执行事务期间,确保数据…

    other 2023年5月5日
    00
  • 简介可以自动完成UI的AngularJS工具angular-smarty

    简介可以自动完成UI的AngularJS工具angular-smarty攻略 介绍 angular-smarty是一个用于AngularJS的工具,它可以帮助开发人员自动完成UI。它提供了一种简单而强大的方式来生成AngularJS应用程序的用户界面。 安装 要使用angular-smarty,您需要按照以下步骤进行安装: 在您的项目中,使用npm安装ang…

    other 2023年8月20日
    00
  • Android 驱动编写LED-NDK程序

    针对”Android 驱动编写LED-NDK程序”,下面是详细的攻略过程: 1. 准备工作 开发过程中需要的一些准备工作: (1)Android驱动编写LED开发板 正常情况下,开发板上都会有LED指示灯,我们可以通过控制这些指示灯达到验证驱动是否正常执行的效果。 (2)NDK NDK 是一个让你用 C 或 C++ 来构建 Android 应用的工具集。通常…

    other 2023年6月26日
    00
  • SpringBootTest单元测试报错的解决方案

    针对SpringBootTest单元测试报错的解决方案,我为你提供以下完整攻略: 1. 异常情况分析 SpringBoot的单元测试通常使用的是SpringBootTest注解,其可以方便地启动IOC容器,包括各种Bean和数据源等。当在单元测试中启动IOC容器后,就可以进行Bean的自动注入测试以及调用接口测试。 当单元测试报错时,需要根据错误提示进行异常…

    other 2023年6月26日
    00
  • MySQL将多条数据合并成一条的完整示例

    一、前言 MySQL是一款非常流行的数据库软件,我们在实际开发中经常会用到MySQL。有时候我们需要将多条数据合并成一条,一般情况下我们可以使用GROUP_CONCAT函数来实现。本文就将详细讲解如何使用GROUP_CONCAT函数将多条数据合并成一条。 二、GROUP_CONCAT函数介绍 GROUP_CONCAT函数是MySQL中的一个聚合函数,其作用是…

    other 2023年6月25日
    00
  • 解决执行maven命令时提示Process terminated的问题

    解决执行maven命令时提示Process terminated的问题,可以尝试以下几个方法: 1. 检查环境变量 检查Maven是否正确安装并在环境变量中配置。可以使用以下命令检查Maven是否正确配置: mvn -version 如果输出了Maven的版本信息,则说明Maven已经正确安装并在环境变量中配置了。如果没有输出,则需要重新安装或配置Maven…

    other 2023年6月27日
    00
  • FreeRTOS实时操作系统的内存管理分析

    FreeRTOS实时操作系统的内存管理分析攻略 简介 FreeRTOS是一款开源的实时操作系统,广泛应用于嵌入式系统中。内存管理是操作系统的重要组成部分,本攻略将详细讲解FreeRTOS的内存管理机制。 内存管理机制 FreeRTOS使用动态内存分配器来管理内存,主要包括堆和栈的管理。 堆管理 FreeRTOS使用堆来分配动态内存,堆的大小可以在配置文件中进…

    other 2023年8月1日
    00
  • js判断鼠标左、中、右键哪个被点击的方法

    要判断鼠标左、中、右键哪个被点击,一般有以下两种方法: 一、使用mousemove和mousedown事件判断 在document或者某个元素上绑定mousedown事件; 在mousedown事件回调中判断鼠标按下的键位,可以用event.button来获取,其中0表示左键,1表示中键,2表示右键; 如果鼠标左键/中键/右键被按下,就记录下来; 在mous…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部