当前位置: 首页 > news >正文

Java基础之泛型

Java基础之泛型

  • 一、泛型应用范围
  • 二、使用泛型方法
  • 三、泛型类

一、泛型应用范围

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序

二、使用泛型方法

  • 在方法的返回类型之前声明类型参数: 泛型方法的类型参数声明应该在方法的返回类型之前,使用尖括号括起来。
public <T> void methodName(T parameter) {// 方法实现
}
  • 使用泛型类型参数: 在方法的参数列表、返回类型或方法体中,可以使用泛型类型参数来表示参数类型或返回类型
public <T> T someMethod(T input) {// 方法实现return input;
}
  • 类型参数可以有任意名称: 泛型方法中的类型参数可以使用任意合法的标识符名称。通常,使用单个大写字母(如 TEKV 等)表示类型参数是一种常见的惯例。
public <E> void processElement(E element) {// 方法实现
}
  • E - Element (在集合中使用,因为集合中存放的是元素)
  • T - Type(Java 类)
  • K - Key(键)
  • V - Value(值)
  • N - Number(数值类型)
  • - 表示不确定的 java 类型
  • 泛型方法可以有多个类型参数: 泛型方法可以有多个类型参数,这些参数在尖括号中逗号分隔。
public <T, U> void processPair(T first, U second) {// 方法实现
}
  • 类型参数的范围(bounded type parameters): 类型参数可以被限制为某个特定的类或接口,以确保方法能够使用特定类型的方法或属性。这称为类型参数的边界。
public <T extends Number> void processNumber(T number) {// 方法实现
}
  • 泛型方法可以在泛型类或非泛型类中定义: 泛型方法不一定要在泛型类中定义,它可以在普通类中定义,或者在泛型类中定义,或者在接口中定义。
// 在普通类中定义泛型方法
public class MyClass {public <T> void myMethod(T parameter) {// 方法实现}
}// 在泛型类中定义泛型方法
public class MyGenericClass<T> {public <U> void myMethod(U parameter) {// 方法实现}
}// 在接口中定义泛型方法
public interface MyInterface {<T> void myMethod(T parameter);
}

代码示例

public class GenericMethodExample {// 泛型方法,接受任意类型的数组并打印public <T> void printArray(T[] array) {for (T element : array) {System.out.print(element + " ");}System.out.println();}// 泛型方法,接受任意类型的参数并返回public <T> T identity(T input) {return input;}// 泛型方法,使用类型参数的边界public <T extends Number> double square(T number) {return Math.pow(number.doubleValue(), 2);}public static void main(String[] args) {GenericMethodExample example = new GenericMethodExample();// 调用泛型方法,传入不同类型的数组Integer[] intArray = {1, 2, 3, 4, 5};Double[] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5};String[] stringArray = {"one", "two", "three", "four", "five"};System.out.println("Integer Array:");example.printArray(intArray);System.out.println("Double Array:");example.printArray(doubleArray);System.out.println("String Array:");example.printArray(stringArray);// 调用泛型方法,传入不同类型的参数String result1 = example.identity("Hello");Integer result2 = example.identity(123);System.out.println("Identity Result 1: " + result1);System.out.println("Identity Result 2: " + result2);// 使用类型参数的边界double squareResult = example.square(4);System.out.println("Square Result: " + squareResult);}
}

三、泛型类

泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。

和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。

代码示例

public class Box<T> {private T t;public void add(T t) {this.t = t;}public T get() {return t;}public static void main(String[] args) {Box<Integer> integerBox = new Box<Integer>();Box<String> stringBox = new Box<String>();integerBox.add(new Integer(10));stringBox.add(new String("学生数据"));System.out.printf("整型值为 :%d\n\n", integerBox.get());System.out.printf("字符串为 :%s\n", stringBox.get());}

相关文章:

  • 【腾讯云云上实验室】用向量数据库在金融信用数据库分析中的实战运用
  • 03_MySQL基本SQL语句讲解
  • Spark-06:Spark 共享变量
  • 【开源】基于Vue和SpringBoot的个人健康管理系统
  • 电脑投屏到电视的软件,Mac,Linux,Win均可使用
  • 解读向量数据库
  • C++学习之路(六)C++ 实现简单的工具箱系统命令行应用 - 示例代码拆分讲解
  • KVM虚拟机的NAT网络模式原理及过程展示
  • Android frameworks 开发总结之九(Settings)
  • MySQL与Redis如何保证数据的一致性
  • rust tokio select!宏详解
  • python爬虫进阶篇(异步)
  • 第十七章 处理空字符串和 Null 值 - XMLIGNORENULL、XMLNIL 和 XMLUSEMPTYELEMENT 的详细信息
  • C#,《小白学程序》第二十一课:大数的减法(BigInteger Subtract)
  • 第十六章 解读深度学习中Batch Size、Iterations和Epochs(工具)
  • DOM的那些事
  • extract-text-webpack-plugin用法
  • Facebook AccountKit 接入的坑点
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • leetcode386. Lexicographical Numbers
  • Linux Process Manage
  • Spark RDD学习: aggregate函数
  • WebSocket使用
  • windows-nginx-https-本地配置
  • 编写高质量JavaScript代码之并发
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 来,膜拜下android roadmap,强大的执行力
  • 码农张的Bug人生 - 初来乍到
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 排序算法之--选择排序
  • 前端
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)80c52学习之旅-起始篇
  • (转)母版页和相对路径
  • *** 2003
  • .gitignore文件—git忽略文件
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net CHARTING图表控件下载地址
  • .Net Winform开发笔记(一)
  • .net实现客户区延伸至至非客户区
  • /*在DataTable中更新、删除数据*/
  • ::什么意思
  • []Telit UC864E 拨号上网
  • [Android 13]Input系列--获取触摸窗口
  • [AX]AX2012开发新特性-禁止表或者表字段