Java基础之泛型
Java基础之泛型
- 一、泛型应用范围
- 二、使用泛型方法
- 三、泛型类
一、泛型应用范围
泛型提供了编译时类型安全检测机制,该机制允许程序员在
编译时
检测到非法的类型。使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序
二、使用泛型方法
- 在方法的返回类型之前声明类型参数: 泛型方法的类型参数声明应该在方法的返回类型之前,使用尖括号括起来。
public <T> void methodName(T parameter) {// 方法实现
}
- 使用泛型类型参数: 在方法的参数列表、返回类型或方法体中,可以使用泛型类型参数来表示参数类型或返回类型
public <T> T someMethod(T input) {// 方法实现return input;
}
- 类型参数可以有任意名称: 泛型方法中的类型参数可以使用任意合法的标识符名称。通常,使用单个大写字母(如
T
、E
、K
、V
等)表示类型参数是一种常见的惯例。
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());}