一篇文章带你搞定JAVA泛型

一篇文章带你搞定JAVA泛型

什么是泛型?

Java 泛型(Generics)是 JDK5.0 引入的新特性。将类型作为参数进行传递即为泛型。泛型可以提高程序的安全性和可读性。

泛型的声明与使用

泛型的声明:使用尖括号 <> 定义一个类型参数,然后应用到类、接口或方法的参数、返回值等变量类型的定义当中。

public class MyClass<T> {
    T obj;

    public MyClass(T obj) {
        this.obj = obj;
    }

    public T getObject() {
        return this.obj;
    }
}

泛型的使用:在创建对象、方法调用、类实现接口等使用时,需要确定泛型的具体类型参数。

MyClass<Integer> mc = new MyClass<>(10);
int number = mc.getObject();

通配符

通配符是一种不确定的类型参数,使用 ? 表示。通配符的主要作用是让方法能接受不同的泛型类型参数。

上限通配符

使用 extends 关键字限定泛型类型的上限。如下例,泛型类型为 Number 或 Number 的子类。

public void printNumberList(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
}

下限通配符

使用 super 关键字限定泛型类型的下限。如下例,泛型类型为 Integer 或 Integer 的父类。

public void addInteger(List<? super Integer> list) {
    list.add(12);
    list.add(23);
}

泛型类和泛型方法

泛型类和泛型方法可以为一个类或方法定义的类型参数提供更大的灵活性。

public class Box<T> {
    private T object;

    public void setObject(T object) {
        this.object = object;
    }

    public T getObject() {
        return object;
    }

    public <U extends Number> void inspect(U u) {
        System.out.println("T: " + object.getClass().getName());
        System.out.println("U: " + u.getClass().getName());
    }
}

示例

示例一:使用泛型提高程序安全性和可读性

比较使用泛型和不使用泛型的差异。

List list = new ArrayList();
list.add("hello");
String str = (String)list.get(0); // 需要强制类型转换

List<String> strList = new ArrayList<String>();
strList.add("hello");
String str1 = strList.get(0); // 不需要强制类型转换

示例二:使用 extends 通配符限定泛型类型的上限

public static double sum(List<? extends Number> list) {
    double sum = 0.0;
    for (Number n : list) {
        sum += n.doubleValue();
    }
    return sum;
}

List<Integer> intList = Arrays.asList(1, 2, 3);
double sum = sum(intList);

总结

Java 泛型是提高程序安全性和可读性的重要工具,需要熟练掌握泛型的声明与使用、通配符、泛型类和泛型方法等相关知识点。使用泛型能够提高代码的可维护性和可扩展性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一篇文章带你搞定JAVA泛型 - Python技术站

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

相关文章

  • Sprint Boot @DeleteMapping使用方法详解

    @DeleteMapping是Spring Boot中的一个注解,它用于将HTTP DELETE请求映射到控制器方法上。在使用Spring Boot开发Web应用程序时,@DeleteMapping是非常重要的。本文将详细介绍@DeleteMapping的作用和使用方法,并提供两个示例说明。 @DeleteMapping的作用 @DeleteMapping的…

    Java 2023年5月5日
    00
  • EJB3.0部署消息驱动Bean抛javax.naming.NameNotFoundException异常

    EJB 3.0 中的消息驱动 Bean(MDB)是一种常用的异步编程模型,它可以接收 JMS 消息并执行相应的业务逻辑。在部署时,可能会遇到 javax.naming.NameNotFoundException 异常,这通常是由于 JNDI 查找失败引起的。下面是针对该异常的完整攻略。 1. 检查 JNDI 名称 在 EJB 模块中部署 MDB 时,需要使用…

    Java 2023年6月15日
    00
  • 微信公众平台 发送模板消息(Java接口开发)

    下面是关于微信公众平台发送模板消息的完整攻略: 一、准备工作 首先需要在微信公众号官方平台注册并开通微信公众号,获取AppID和AppSecret等信息,并配置好开发者模式下的服务器URL以及消息加解密设置。 在微信公众平台后台找到“模板消息”功能,创建需要的模板并获取模板ID和关键词ID。 使用Java语言编写代码,引入相关依赖包,如weixin-java…

    Java 2023年5月23日
    00
  • JavaScript 下载链接图片后上传的实现

    JavaScript 下载链接图片后上传的实现可以分为两个步骤: 步骤一:使用 fetch 下载图片 使用 fetch 函数可以快速、简单地下载远程图片。 fetch 函数可以返回图片的二进制数据,并且可以设置一些参数,例如请求的 method、headers、mode 等。下面是一个下载图片的示例: fetch(‘http://example.com/im…

    Java 2023年6月15日
    00
  • RateLimit-使用guava来做接口限流代码示例

    为保护服务器的正常运行和客户端的正常使用,我们需要对接口进行访问限制。本文介绍了使用Guava RateLimit实现接口限流的代码示例。 Guava RateLimit简介 Guava是由Google开发的Java类库,其中包含了RateLimiter类,可用于接口限流。RateLimiter可以用于限制一定时间内的请求频率,比如每秒钟只能处理10个请求。…

    Java 2023年5月19日
    00
  • 解决VS2015中没有报表项(ReportViewer)的方法

    解决VS2015中没有报表项(ReportViewer)的方法 在VS2015中创建WinForm项目时,默认情况下是没有报表项(ReportViewer)的,那么该如何解决呢?下面提供两种解决方法。 方法一:通过VS2015安装程序安装报表项(ReportViewer) 打开VS2015安装程序,在“个性化”页面中选择“修改”。 在“工作负载”选项中,勾选…

    Java 2023年6月15日
    00
  • 如何进行Java异步编程?

    首先,为了进行Java异步编程,我们需要了解以下概念: 回调函数(Callback):是一种异步编程的实现方式,即在某个任务完成后执行的函数。 Future模式:是一种异步编程设计模式,它允许我们在执行一个任务时,不用一直等待结果,而是可以先返回一个Future对象,稍后再获取真正的结果。 CompletableFuture:是Java 8新增的一种异步编程…

    Java 2023年5月11日
    00
  • 动态JSP页生成静态HTML的方法

    动态JSP页生成静态HTML的方法,通常称为JSP静态化。JSP静态化是指使用JSP页面进行网页制作后,将JSP页面在浏览器访问前,通过指定的技术或者工具,将该JSP页面的内容生成在服务器端,并将具有静态HTML页面的形式的方法。这种方法的主要目的是加速网页的访问速度,缓解服务器压力,提高网站的性能和稳定性。 JSP静态化的过程一般分成三步:1. 编写JSP…

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