Java中的泛型数据
一.定义和注意
在Java中,泛型是一种参数化类型的机制,允许在定义类、接口或方法时使用类型参数,使得代码可以在不同的具体类型上复用,提高代码的通用性和安全性。
注意:
类型参数通常使用单个大写字母表示,常见的有 T (Type)、 E (Element,常用于集合)、 K (Key,常用于键值对)、 V (Value,常用于键值对) 等。
- 泛型类型参数在编译时会被擦除,这意味着在运行时,泛型代码中的类型参数会被替换为其限定类型(如果没有限定则为 Object ),这也是Java泛型和C#泛型的一个重要区别。
二.泛型的使用
首先我们先来创建一个栈类型数据,但是这时候就有一个问题:我传输的数据和她能接受的数据必须是一种,如果我们想传多种数据该怎末办呢?
这时候就要用到泛型数据:首先需要自己定义一个类型数据如下图的”孙敬泽“(为什么arr=new 孙敬泽会报错?,因为电脑数据类型里识别不了你自己新定义的一个孙敬泽数据,所以这里需要进行一个强制类型转换。将”孙敬泽“数据转为最大的Object类对象,因为Object是最大的类,包含所有类型的数据,若些别的类太小了包含不了所有)那么”孙敬泽“到底是一个什么类型的数据呢,接受的时候在Stack后加上他具体的数据类型就可以了,但是注意要放进栈里的必须是一类数据,泛型数据就是泛指一切数据类型
那么为什么直接用Object 不行呢?
用Object的却可以输入不同的数据类型,但是有些类型例如数组,它的定义是一堆相同数据类型的集合,这时候再用这个输入就会打破常规,所以不用Object。
三.使用形式
泛型类
泛型类是将类型参数化的类,使用尖括号 <> 来定义类型参数。语法格式如下:
class 类名<类型参数列表> {
// 类的成员变量、方法等
类型参数列表 成员变量;
返回值类型 方法名(类型参数列表 参数) {
// 方法体
}
}
示例:定义一个简单的泛型类 Box ,用于存储任意类型的数据class Box<T> {private T data;public T getData() {return data;}public void setData(T data) {this.data = data;}
}
使用方式:public class Main {public static void main(String[] args) {// 创建一个存储Integer类型的Box对象Box<Integer> integerBox = new Box<>(); integerBox.setData(10);Integer num = integerBox.getData();// 创建一个存储String类型的Box对象Box<String> stringBox = new Box<>(); stringBox.setData("Hello");String str = stringBox.getData();}
}
泛型方法
泛型方法是在方法中使用类型参数,它可以在普通类中定义,也可以在泛型类中定义。语法格式如下:
修饰符 <类型参数列表> 返回值类型 方法名(类型参数列表 参数) {
// 方法体
}
示例:在普通类中定义泛型方法class GenericMethodExample {// 泛型方法,用于交换两个指定类型的值public static <T> void swap(T[] arr, int i, int j) {T temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}
使用方式:public class Main {public static void main(String[] args) {Integer[] intArray = {1, 2};GenericMethodExample.swap(intArray, 0, 1);for (Integer num : intArray) {System.out.print(num + " ");}}
}
总结:
泛型是编程语言中一种参数化类型的机制,允许在定义类、接口或方法时使用未知的类型参数,在使用时再指定具体类型,从而实现代码的复用和类型安全。
核心作用
- 代码复用:无需为不同数据类型重复编写相似逻辑,比如一个泛型集合类可存储整数、字符串等各种类型数据。
- 类型安全:编译时检查数据类型,避免运行时出现类型转换错误。例如,指定为 List<String> 的集合,编译时就会阻止添加整数。
基本使用形式
- 类/接口泛型:定义时在名称后加 <类型参数> ,如 class Box<T> { T value; } ,使用时指定具体类型 Box<Integer> box = new Box<>(); 。
- 方法泛型:在方法返回值前声明类型参数,如 public <T> T getValue(T[] array) { ... } ,调用时可自动推断类型。
简单来说,泛型就像给代码装了一个“通用接口”,既能灵活适配不同数据类型,又能保证类型正确,是提高代码通用性和安全性的重要工具。