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日

相关文章

  • Vue3 通过作用域插槽实现树形菜单嵌套组件

    Vue3 通过作用域插槽实现树形菜单嵌套组件攻略 在Vue3中,我们可以使用作用域插槽(Scoped Slots)来实现树形菜单的嵌套组件。作用域插槽允许我们在父组件中定义子组件的模板,并将数据传递给子组件进行渲染。下面是一个详细的攻略,包含了两个示例说明。 步骤1:创建树形菜单组件 首先,我们需要创建一个树形菜单组件,用于显示菜单的层级结构。在这个组件中,…

    other 2023年7月27日
    00
  • Oracle字段根据逗号分割查询数据的方法

    下面是Oracle字段根据逗号分割查询数据的方法的完整攻略。 1. 准备工作 在进行之前,我们需要先创建一张测试表,示例代码如下: CREATE TABLE test_table ( id NUMBER(10) NOT NULL, name VARCHAR2(100) NOT NULL, interests VARCHAR2(100) NOT NULL );…

    other 2023年6月25日
    00
  • 0基础学习前端开发的一些建议

    0基础学习前端开发的一些建议 学习前端开发是一个有趣且具有挑战性的过程。对于零基础的学习者来说,以下是一些建议,可以帮助你开始学习前端开发并取得进展。 1. 建立坚实的HTML和CSS基础 HTML和CSS是前端开发的基础。HTML用于创建网页的结构,而CSS用于控制网页的样式。学习这两门语言是你入门前端开发的第一步。 学习HTML标签和语法:了解HTML的…

    other 2023年7月27日
    00
  • JS递归遍历查询是否有权限示例详解

    下面是“JS递归遍历查询是否有权限示例详解”的完整攻略。 1. 前言 在前端开发过程中,经常会需要遍历某个数据结构,进行相关操作,比如判断某个用户是否有某个权限。如果数据结构比较复杂,常规的循环遍历可能会比较麻烦。此时,递归遍历可能会更为便捷和高效。 2. 什么是递归? 递归是一种常见的算法。它通过将问题分解为相同但规模更小的子问题,来求解原问题。递归通常包…

    other 2023年6月27日
    00
  • QQ空间说说手机自定义标识代码汇总及使用方法大全

    QQ空间说说手机自定义标识代码汇总及使用方法大全 什么是QQ空间自定义标识? 在QQ空间中,自定义标识可以让用户在发表说说时添加一些特殊的效果,比如添加背景图片、表情、个性化边框等等。使用自定义标识可以使得你的说说更加丰富有趣,增加互动和好感度。 QQ空间自定义标识的使用方法 在发表说说的时候,可以在文本框上方找到自定义标识按钮,点击即可弹出自定义标识面板。…

    other 2023年6月25日
    00
  • ReentrantLock获取锁释放锁的流程示例分析

    ReentrantLock是一个可重入锁,和synchronized关键字一样,在Java中被广泛使用。但是,相较于synchronized关键字,ReentrantLock在一些场景下表现得更好,比如可以响应中断、可以指定尝试获取锁的时间等等。 ReentrantLock获取锁和释放锁是一个比较重要的知识点,我们需要深入了解其工作流程。下面,我们将通过两个…

    other 2023年6月27日
    00
  • maya2016新增哪些功能? maya2016新功能详细介绍

    Maya 2016 新增功能详细介绍 Maya 2016 是一款功能强大的三维计算机图形软件,它在其版本更新中引入了许多新功能和改进。以下是 Maya 2016 中的一些新增功能的详细介绍: 1. Bifrost 渲染器 Maya 2016 引入了全新的 Bifrost 渲染器,它是一个基于节点的渲染引擎,可以实现更高质量的渲染效果。Bifrost 渲染器具…

    other 2023年7月27日
    00
  • linux定时任务crontab

    Linux定时任务crontab的完整攻略 Crontab是Linux系统中的一个定时任务管理工具,可以帮助用户在指定的时间自动执行某些命令或脚本。本文将为您提供Linux定时任务crontab的完整攻略,包括crontab的语法、使用方法、示例说明等内容。 crontab的语法 Crontab的语法由6个字段组成,分别表示分钟、小时、日、月、星期和要执行的…

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