Java中泛型学习之细节篇

yizhihongxing

Java中泛型学习之细节篇

泛型擦除

在Java中,泛型实现是基于类型擦除的。

当我们在定义一个泛型类或泛型方法时,编译器会将其中的参数类型替换成Object类型。这意味着,在运行时,我们无法再获取原始的参数类型。

举个例子,下面这个泛型类在编译后会被擦除:

public class Generic<T> {
    private T t;

    public T get() {
        return t;
    }

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

在编译后,泛型类型会被替换成Object类型,代码如下:

public class Generic {
    private Object t;

    public Object get() {
        return t;
    }

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

因此,我们在实例化泛型对象时,不能使用原始类型,如:

Generic<Integer> g = new Generic<>(); // 编译错误

应该使用引用类型:

Generic<Integer> g = new Generic<Integer>();

泛型的上下限

Java中泛型还有一个重要的概念:上下限。

在使用泛型时,我们有时候希望泛型参数类型是一个特定的类型或其子类型,或者是一个特定的类型或其父类型。这时就可以使用泛型的上下限。

上限

上限用extends关键字声明,表示泛型参数类型必须是指定类型或其子类型。示例如下:

public class Generic<T extends Number> {
    private T t;

    public T get() {
        return t;
    }

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

// 实例化Generic
Generic<Integer> intObj = new Generic<Integer>(); // 编译通过,T是Number的子类Integer
Generic<String> strObj = new Generic<String>(); // 编译错误,T不是Number的子类

在上面的示例中,泛型参数类型T必须是Number的子类,因此可以实例化一个泛型对象Generic,但无法实例化Generic

下限

下限用super关键字声明,表示泛型参数类型必须是指定类型或其父类型。示例如下:

public class Generic<T> {
    private T t;

    public T get() {
        return t;
    }

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

    public void process(List<? super Integer> list) {
        // 处理过程
    }
}

// 实例化Generic
Generic<Object> obj = new Generic<Object>(); // 编译通过,Integer是Object的子类
Generic<Number> num = new Generic<Number>(); // 编译通过,Integer是Number的子类
Generic<Integer> i = new Generic<Integer>(); // 编译错误,Integer不是Integer的父类

在上面的示例中,process方法接收一个<? super Integer>类型的List对象,表示List中的元素必须是Integer的父类。因此,可以将List和List传入,但无法将List传入。

总结

Java中泛型学习之细节篇主要讲解了泛型擦除和泛型的上下限。了解泛型的概念和用法对于提高Java编程效率具有非常重要的意义。

以上仅为简单示例,更多关于Java泛型的细节问题,如泛型数组、泛型空包装类等,可进一步深入学习。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中泛型学习之细节篇 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • springboot使用外置tomcat启动方式

    下面是关于“springboot使用外置tomcat启动方式”的完整攻略。 1. 准备工作 在开始使用外置tomcat启动SpringBoot应用之前,需要先进行一些准备工作。 1.1 确认Tomcat版本 确保Tomcat版本符合SpringBoot版本要求。可以通过SpringBoot官方文档中的 Supported Application Server…

    Java 2023年5月19日
    00
  • MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用

    一、MyBatis-Plus之selectMaps、selectObjs、selectCount、selectOne的使用 selectMaps MyBatis-Plus提供的selectMaps方法可以返回一个List\<Map\<String, Object>>对象,其中包含查询的结果集中的每一行记录,每一行记录都会转成一个Map…

    Java 2023年5月20日
    00
  • springboot使用JdbcTemplate完成对数据库的增删改查功能

    下面是详细的攻略: 1. 引入依赖 首先在pom.xml文件中添加JdbcTemplate的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifact…

    Java 2023年5月20日
    00
  • Java数组的运用详解

    Java 数组的运用详解 什么是数组? 数组是一种容纳固定数量数据元素的方式。在Java语言中,数组就是一个对象,它可以容纳一定数量、相同类型的元素。数组的下标从0开始。 Java中的数组是静态的,也就是说一旦数组被创建后,它的大小便固定下来,不能再动态地改变。 数组的定义和初始化 Java中的数组可以定义为如下格式: type arrayName[]; /…

    Java 2023年5月26日
    00
  • JavaSpringBoot报错“HttpMessageConversionException”的原因和处理方法

    原因 “HttpMessageConversionException” 错误通常是以下原因引起的: 请求体格式不正确:如果您的请求体格式不正确,则可能会出现此错误。在这种情况下,您需要检查您的请求体格式并确保它们正确。 请求体类型不支持:如果您的请求体类型不支持,则可能会出现此。在这种情况下,您需要检查您的请求体类型并确保它们受支持。 解决办法 以下是解决 …

    Java 2023年5月4日
    00
  • JAVA实现往字符串中某位置加入一个字符串

    现在我会详细讲解如何在Java中实现往字符串中某位置加入一个字符串的完整攻略。下面是具体步骤: 1. 创建一个StringBuilder对象 在Java中,比起直接使用String类,我们更推荐使用StringBuilder类来进行字符串拼接。因为每次对一个String对象进行字符串拼接时,都会创建一个新的String对象,这样就会浪费很多内存空间。 Str…

    Java 2023年5月26日
    00
  • Tomcat 是如何管理Session的方法示例

    Tomcat 是一个流行的 Java Web 服务器,可以通过 Session 技术实现 Web 应用程序的状态管理。下面我们来详细讲解 Tomcat 是如何管理 Session 的方法示例。 1. 使用 HTTPSession 接口 Tomcat 通过内置的 HTTPSession 接口来管理 Session。若要在应用程序中使用 Session,可以通过…

    Java 2023年5月19日
    00
  • Java 实战练手项目之校园超市管理系统的实现流程

    校园超市管理系统是一个相对综合的Java实战练手项目,涉及到多个模块和技术。下面将详细阐述实现该系统的完整攻略。 1. 需求分析 在实现任何一个应用程序之前,我们需要首先进行需求分析,确定该系统需要满足哪些需求。在校园超市管理系统中,常见的需求包括: 商品管理:实现商品的添加、编辑、删除、查询等功能; 库存管理:对库存进行统计、报表展示等操作; 订单管理:实…

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