java基础学习笔记之泛型

Java基础学习笔记之泛型

简介

Java 泛型 (generics) 是 JDK 1.5 版本引入的一种数据类型,能够让程序员在编写代码时指定一些类型约束,可以更加简洁安全地使用泛型类型,提高代码的可读性和可维护性。

泛型的作用

泛型可以帮助程序员定义更加通用的代码模板,可以用来限定集合类的元素类型,避免运行时类型转换,提高程序的稳定性和效率。

泛型还可以用在各种类、接口的定义中,类似于模板,可以根据使用者的不同需要实现不同的类型转换。

声明泛型

泛型可在以下三种中进行声明:

class ClassName<T> {  }
interface InterfaceName<T> {  }
class ClassName {
  <T> void methodName(T t) {  }
}

<T>是类型参数,可根据需要指定为其他大写字母。

使用泛型

定义泛型类

定义泛型类时需要用到类型参数,类型参数T用于定义集合类的元素类型,如下例:

public class MyList<T> {
   private List<T> list = new ArrayList<>();
   public void add(T t) {
      list.add(t);
   }
   public T get(int index) {
      return list.get(index);
   }
}

泛型类 MyList 可以定义任何类型的列表,如整数列表、字符串列表、对象列表等,使用例子如下:

MyList<Integer> intList = new MyList<Integer>();
for(int i=0; i&lt;10; i++) {
    intList.add(i);
}
int e = intList.get(0);

使用通配符

通配符可以用来指定泛型类的元素类型,方式为使用?代替 T 即可:

public void printList(List<?> list) {
   for(Object elem : list) {
      System.out.print(elem + " ");
   }
}

List<?>表示任何类型的列表,调用方式为:

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

泛型接口

泛型接口同样可以定义泛型类,只需要在接口名后添加类型参数即可:

public interface Converter<T> {
    void convert(T t);
}

使用时需要指定参数类型:

Converter<String> converter = new Converter<String>() {
    @Override
    public void convert(String s) {
        System.out.println(s);
    }
};
converter.convert("Hello, World!");

泛型方法

泛型方法也可以定义泛型,定义方式为:

public class MyMath {
    public static <T extends Number> double add(T x, T y) {
        return x.doubleValue() + y.doubleValue();
    }
}

使用时需要指定参数类型:

double result = MyMath.add(1, 2.5);

示例说明

示例1:使用泛型实现不同类型的列表存储

public class MyList<T> {
    private List<T> list = new ArrayList<>();

    public void add(T t) {
        list.add(t);
    }

    public T get(int index) {
        return list.get(index);
    }

    public void printList() {
        for(T elem : list) {
            System.out.print(elem + " ");
        }
    }
}

使用示例:

MyList<String> strList = new MyList<String>();
MyList<Integer> intList = new MyList<Integer>();
MyList<Double> dblList = new MyList<Double>();
strList.add("Hello");
intList.add(123);
dblList.add(1.23);
strList.printList();
intList.printList();
dblList.printList();

输出结果:

Hello 
123 
1.23 

示例2:使用通配符实现不同类型的列表输出

public void printList(List<?> list) {
    for(Object elem : list) {
        System.out.print(elem + " ");
    }
}

使用示例:

List<Integer> intList = Arrays.asList(1, 2, 3);
List<String> strList = Arrays.asList("Hello", "World");
List<Double> dblList = Arrays.asList(1.23, 4.56, 7.89);
printList(intList);
System.out.println();
printList(strList);
System.out.println();
printList(dblList);

输出结果:

1 2 3 
Hello World 
1.23 4.56 7.89 

总结

泛型让程序员更加方便、更加安全、更加简洁地编写代码,使得代码具有更好的可读性和可维护性。通过本文的介绍,我们学习了泛型的用法以及它在代码中的应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java基础学习笔记之泛型 - Python技术站

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

相关文章

  • 关于@ResponseBody 默认输出的误区的解答

    当使用@ResponseBody注解返回结果时,Spring默认使用Jackson库将返回结果直接转换为JSON格式输出。这种行为经常会造成一些误解,下面针对一些误区进行解答。 误解一:@ResponseBody会自动添加@RestController? @RestController注解是@Controller和@ResponseBody的结合体,用于指示…

    Java 2023年5月26日
    00
  • Java多线程之线程的创建

    Java是一门拥有多线程机制的语言,它的多线程编程是Java编程中必须掌握的重要内容,本文将详细讲解Java多线程之线程的创建。 线程的创建方式 Java中线程的创建主要有以下两种方式: 继承Thread类 继承Thread类是Java中最基本的一种创建线程的方式,创建一个线程类需要继承Thread类,并重写run方法。在run方法中编写线程需要执行的任务,…

    Java 2023年5月26日
    00
  • 完整详解Java开发学习路线指南

    完整详解Java开发学习路线指南 Java是一门非常流行的编程语言,在软件开发领域具有广泛的应用。如果想要成为一名Java开发人员,需要掌握一系列的知识和技能。下面是一个Java开发学习路线的完整攻略,希望可以帮助大家快速入门Java开发。 学习基础知识 Java开发的第一步是掌握基础知识。以下是Java开发初学者需要掌握的几个基本概念: 数据类型 Java…

    Java 2023年5月20日
    00
  • 详解SpringMVC从基础到源码

    以下是关于“详解SpringMVC从基础到源码”的完整攻略,其中包含两个示例。 详解SpringMVC从基础到源码 SpringMVC是一个基于MVC模式的Web框架,它提供了一种灵活、高效的方式来开发Web应用程序。在本攻略中,我们将从基础概念到源码实现,全面讲解SpringMVC的工作原理和实现细节。 SpringMVC基础概念 MVC模式 MVC模式是…

    Java 2023年5月16日
    00
  • Springboot整合企业微信机器人助手推送消息的实现

    什么是企业微信机器人助手? 企业微信机器人助手是企业微信推出的一款机器人应用,旨在方便企业在企业微信中进行消息推送、管理和协作等操作。企业微信机器人助手可以通过API接口,实现与企业自有的应用进行对接。 Springboot整合企业微信机器人助手的实现过程 下面我们来讲一下如何在Springboot中整合企业微信机器人助手,实现推送消息的功能。 2.1 准备…

    Java 2023年5月20日
    00
  • JAVA 自定义线程池的最大线程数设置方法

    下面是详细讲解Java自定义线程池的最大线程数设置方法的攻略。 什么是线程池 线程池是一种基于池化思想的线程使用方式。以线程池的方式管理线程,从而避免线程创建和销毁时造成的性能损耗,提高应用程序的性能和稳定性。在Java中,提供了Executor和ExecutorService这两个接口,通过这两个接口可以创建线程池。 Java自定义线程池的创建 在Java…

    Java 2023年5月18日
    00
  • Java ArrayList扩容机制原理深入分析

    Java ArrayList扩容机制原理深入分析 在 Java 中,ArrayList 是一种动态数组,它可以自动扩容以适应数据的增长。了解 ArrayList 扩容机制的原理,有助于我们更好地理解和使用 ArrayList,提高代码效率。 ArrayList 扩容机制 ArrayList 内部使用数组来存储元素,当向 ArrayList 中添加元素时,如果…

    Java 2023年5月26日
    00
  • Springboot整合Redis实现超卖问题还原和流程分析(分布式锁)

    下文将详细讲解Spring Boot整合Redis实现超卖问题还原和流程分析的完整攻略。 简介 超卖是电商系统开发中常见的问题之一,那么如何避免呢?本文主要介绍如何利用Spring Boot整合Redis实现分布式锁来解决超卖问题。 超卖问题 假设电商平台需要在某个时间段内销售一定数量的商品。同时,多个用户可以在同一时间内尝试购买该商品。如果没有控制好并发的…

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