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

yizhihongxing

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日

相关文章

  • 如何解决电脑选择关机但又重新启动的问题

    如何解决电脑选择“关机”但又重新启动的问题? 当我们选择关机时,电脑却又自动重启,这可能会让我们感到烦恼。这种问题会被 操作系统的故障 硬件电源管理的问题 两个方面引起。下面我们将讨论这些原因以及如何解决这些问题。 操作系统故障 1. 禁用“自动重启” 在某些情况下,Windows系统可能会自动重新启动,例如在更新安装完成后或者系统出现故障时。为了防止重启,…

    other 2023年6月27日
    00
  • 怎样使用bluescreenview查看电脑蓝屏原因

    怎样使用Bluescreenview查看电脑蓝屏原因 Bluescreenview是一款免费的Windows工具,可以帮助用户分析和诊断电脑蓝屏错误。它可以读取Windows系统的minidump,并显示有关蓝屏错误的详细信息。本文将提供一个完整的攻略,介绍如何使用Bluescreenview查看电脑屏原因,并提供两个示例说明。 Bluescreenview…

    other 2023年5月8日
    00
  • Java入门绊脚石之Override和Overload的区别详解

    Java入门绊脚石之Override和Overload的区别详解 什么是Override和Overload? Override和Overload都是Java中的重载(overload)机制,它们都允许在一个类中有多个同名的方法,但是它们有不同的应用场景。 Override指子类继承父类之后,重新定义该方法的实现过程的行为,方法的名称、参数类型、返回值类型必须…

    other 2023年6月26日
    00
  • WPF利用ValueConverter实现值转换器

    下面我来详细讲解“WPF利用ValueConverter实现值转换器”的完整攻略,并附带两个示例说明。 什么是WPF值转换器? 在WPF中,值转换器(Value Converter)是一种特殊的类,用于将一个值从一种类型转换为另一种类型。WPF值转换器通常与绑定(Binding)一起使用,使数据在UI界面中正确绑定数据源。 实现WPF值转换器的步骤 要实现W…

    other 2023年6月26日
    00
  • Android开发之App widget用法实例分析

    标题:Android开发之App widget用法实例分析 一、什么是App Widget App Widget 是 Android 系统提供的一种轻量级的应用组件,用于在桌面上显示有关应用程序的信息。它能够在桌面上完成部分应用的功能,而无需打开应用本身,非常方便用户。比如,我们可以使用一个 App Widget 显示当前天气情况或者显示某个网站的最新新闻等…

    other 2023年6月27日
    00
  • Java的深拷贝和浅拷贝深入了解

    Java的深拷贝和浅拷贝深入了解 什么是深拷贝和浅拷贝 在Java中,对象的拷贝分为深拷贝和浅拷贝两种方式。 浅拷贝:浅拷贝是指创建一个新对象,然后将原对象的非静态字段值复制到新对象中。如果字段是基本类型,则复制其值;如果字段是引用类型,则复制其引用,即新对象和原对象引用同一个对象。因此,对于引用类型字段的修改会影响到原对象和新对象。 深拷贝:深拷贝是指创建…

    other 2023年10月15日
    00
  • [注册表]注册DLL控件 让IE浏览器复活

    下面是详细的攻略: 1. 开始之前 首先需要明确一下,本攻略主要是针对Windows操作系统,因为在Windows系统中,IE浏览器是与操作系统绑定的,如果系统中没有对应的IE DLL文件,那么就会出现IE浏览器无法使用的情况。此时,需要通过注册DLL控件的方式,将相应的DLL文件注册到系统中,使IE浏览器得以复活。 2. 确定需要注册的DLL文件 在开始注…

    other 2023年6月27日
    00
  • SpringBoot项目启动时如何读取配置以及初始化资源

    要让SpringBoot项目在启动时读取配置以及初始化资源,可以采用以下两种方法: 通过@Configuration注解的类来配置 在SpringBoot项目中,可以使用@Configuration注解来指定一个类为配置类,这个类中可以定义Bean和配置信息。在配置类中,可以使用@Bean注解定义Bean,也可以使用@Value注解来读取配置信息。在这个类中…

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