Java中泛型学习之细节篇

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日

相关文章

  • spring retry实现方法请求重试的使用步骤

    下面我将详细讲解使用Spring Retry实现请求重试的使用步骤。 1. 引入Spring Retry 在Spring Boot中,我们可以通过在pom.xml中引入以下依赖来使用Spring Retry: <dependency> <groupId>org.springframework.retry</groupId>…

    Java 2023年5月20日
    00
  • Spring Security 和Apache Shiro你需要具备哪些条件

    Spring Security 和 Apache Shiro 都是 Java 应用程序中常用的安全框架,可以用来为应用程序提供身份验证、授权、密码管理、会话管理等安全功能。 要学习 Spring Security 和 Apache Shiro,你需要掌握以下基础条件: Java 编程基础:因为两个框架都是基于 Java 的,所以你需要掌握 Java 编程语言…

    Java 2023年5月20日
    00
  • java密钥交换算法DH定义与应用实例分析

    Java密钥交换算法DH定义与应用实例分析 什么是DH算法? DH全称是Diffie-Hellman密钥交换算法,是一种安全的密钥交换协议。该算法的基本思路是:两个通信方都选择一组数字作为私有密钥,然后通过数学运算得出一个公用密钥。由于计算过程需要在一定范围内生成大的素数和进行模幂运算等数学问题,因此DH算法是一种非常安全、不易被破解的密钥交换方式。 DH算…

    Java 2023年5月26日
    00
  • 关于jsp页面使用jstl的异常分析

    关于jsp页面使用jstl的异常分析,我们可以分为以下几个部分来详细讲解: 1. 确认项目中是否引入了jstl标签库 使用jstl标签库需要我们先在项目中引入jstl标签库的Jar包。在Maven项目中可以在pom.xml中添加以下依赖: <dependency> <groupId>javax.servlet</groupId&…

    Java 2023年6月15日
    00
  • Java关键字之native详解

    Java关键字之native详解 在Java编程中,native是一个重要的关键字,本文将对其作用和使用进行详细解释。 native关键字的定义和作用 Java语言是一种面向对象的语言,它有自己的类型系统和运行环境。如果我们需要访问某些底层的系统资源,例如操作系统、硬件等,就需要使用native来声明一个本地方法(native method)。 native…

    Java 2023年5月26日
    00
  • java 中复合机制的实例详解

    Java中复合机制的实例详解 Java中的复合机制是面向对象编程的核心概念之一。本文将详细讲解Java中的复合机制,介绍其实现原理以及两个示例说明。 什么是Java中的复合机制? Java中的复合机制是指对象之间的组合关系。在Java中,类可以通过实例化其他类的对象来实现对其他类对象的管理。这种关系称为“复合关系”,它是Java面向对象编程中的一种重要的机制…

    Java 2023年6月15日
    00
  • Mybatis模糊查询和动态sql语句的用法

    接下来我将详细讲解”Mybatis模糊查询和动态sql语句的用法”的完整攻略。 Mybatis模糊查询 模糊查询一般用于根据用户输入的关键字(搜索词)模糊匹配查询数据库中的数据。在Mybatis中,可以使用LIKE关键字实现模糊查询。 下面是一条简单的Mybatis模糊查询的代码示例: <select id="findUserByName&q…

    Java 2023年5月20日
    00
  • Java Properties作为集合三个方法详解

    当我们使用Java进行编程时,经常需要使用配置文件来存储一些关键的配置信息,于是Java提供了一个名为Properties的类来处理这个问题。Properties是一个Map集合,其中的key和value都必须是字符串类型。下面将详细讲解Java Properties作为集合的三个常用方法:getProperty、setProperty和load。 getP…

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