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日

相关文章

  • Java IO之包装流详解

    Java IO之包装流详解 Java中的IO(输入输出)操作可以通过流(Stream)的形式进行。流分为节点流和处理流,其中处理流又称为包装流。本文主要介绍Java IO中的包装流,包括作用、示例和常见的包装流。 包装流的作用 包装流是对节点流的装饰,它包裹一个已有的节点流并且拥有同样的类型,但提供了更多的功能。包装流常常用于流的串联,通过多个处理流的组合可…

    Java 2023年5月26日
    00
  • Java新手入门学习之正则表达式

    Java新手入门学习之正则表达式 什么是正则表达式? 正则表达式是一种描述字符串模式的语言,可以通过正则表达式来搜索、匹配、替换和分割文本。在Java中,可以使用Java的正则表达式API来完成对于字符串的处理。 Java中正则表达式的基本语法 Java中正则表达式的基本语法如下: pattern.matcher(str).method() 其中patter…

    Java 2023年5月27日
    00
  • Java实现定时器的4种方法超全总结

    Java实现定时器的4种方法超全总结 定时器在Java中是非常常用的功能,可以实现定时任务、周期性任务等多种功能。下面我们将介绍Java实现定时器的四种方法。 1. Timer类 Java内置的Timer类可以实现简单的定时器功能,具体使用方式如下示例: import java.util.Timer; import java.util.TimerTask; …

    Java 2023年5月26日
    00
  • Java的MyBatis框架项目搭建与hellow world示例

    下面是关于Java的MyBatis框架项目搭建与hellow world示例的完整攻略: 1. MyBatis框架项目搭建 1.1 安装MyBatis 首先你需要安装MyBatis的Jar包以及相关依赖,你可以在Maven中央仓库中查找MyBatis的版本并下载对应版本的Jar包。 1.2 配置MyBatis 在项目中添加配置文件mybatis-config…

    Java 2023年5月20日
    00
  • Apache Ant自动化脚本入门教程及常用命令介绍

    Apache Ant自动化脚本入门教程及常用命令介绍 什么是Apache Ant Apache Ant是一个基于Java的自动化构建工具,主要用于软件开发中的编译、打包、部署等操作。使用Ant可以将繁琐的手动操作转换为自动化流程,提高效率,并减少出错的可能性。 安装和配置Ant 下载Ant安装包:从官网 https://ant.apache.org/ 下载最…

    Java 2023年5月19日
    00
  • mybatis-plus团队新作mybatis-mate实现数据权限

    下面我简单讲解一下 “mybatis-plus团队新作mybatis-mate实现数据权限” 的完整攻略。 1. 简介 mybatis-mate 是 mybatis-plus 团队新推出的一个框架,它可以帮助我们更方便地实现数据权限控制。通过使用 mybatis-mate,我们可以很容易地设置数据过滤规则,以保证用户只能看到他们有权限访问的数据。 2. 实现…

    Java 2023年5月20日
    00
  • 使用springmvc配置视图解析器和重定向方式

    在Spring MVC中,视图解析器和重定向是Web开发中的常见需求。本文将详细讲解如何使用Spring MVC配置视图解析器和重定向方式,并提供两个示例说明。 配置视图解析器 视图解析器是Spring MVC中的一个重要组件,它用于将逻辑视图名称解析为实际的视图。在Spring MVC中,我们可以使用InternalResourceViewResolver…

    Java 2023年5月18日
    00
  • Java执行SQL脚本文件到数据库详解

    让我们详细讲解一下“Java执行SQL脚本文件到数据库详解”的完整攻略。 1. 准备工作 在Java程序中执行SQL脚本文件,需要导入以下jar包: mysql-connector-java.jar (MySQL数据库驱动包) commons-dbutils-1.6.jar (Apache DbUtils工具包) 2. 实现步骤 下面是实现Java执行SQL…

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