📅  最后修改于: 2023-12-03 15:16:32.518000             🧑  作者: Mango
在Java中,尖括号 < >
用于定义泛型类型、泛型方法或者通配符类型。可以说泛型是Java编程语言中最强大的特性之一。它可以让你写出更加通用、可重用的代码,减少代码的重复性,提高代码的可读性和安全性。
在Java中,泛型类型就是指具有类型参数的类或接口。其中类型参数用尖括号 < > 括起来,类型参数可以是任意有效的Java标识符,但通常使用单个大写字母来表示。例如:
class MyList<T> {
private T[] arr;
...
}
上面的代码中,MyList
类具有一个类型参数 T
,它表示列表中所存储的元素的类型。这个类型参数将在实例化 MyList
类的时候被指定为具体类型。
泛型方法就是指具有泛型类型参数的方法。在Java中,泛型方法和普通方法的语法非常相似,它们都使用尖括号 < > 来定义类型参数。例如:
class MyUtils {
public static <T> T getFirst(T[] arr) {
if (arr == null || arr.length == 0) {
return null;
}
return arr[0];
}
}
上面的代码中,getFirst
方法具有一个类型参数 T
,它表示方法返回值的类型。当调用 getFirst
方法时,编译器会根据实参的类型推断出类型参数的具体值。
通配符类型是一种特殊的泛型类型,它可以表示一组类型的统一。在Java中,通配符类型使用问号 ?
表示,例如:
class MyList<T> {
public void addAll(Collection<? extends T> c) {
for (T elem : c) {
this.add(elem);
}
}
}
上面的代码中,addAll
方法接收一个参数 c
,它表示一个集合,集合中的元素类型是 T
或 T
的子类。例如,如果 T
是 Number
类型,那么集合中的元素可以是 Integer
、Double
、Long
等等。使用通配符类型可以让 addAll
方法更加灵活,可以接收更多不同类型的集合作为参数。
下面是一个简单的示例程序,展示了如何使用泛型来定义类、方法和接口:
public class App {
public static void main(String[] args) {
MyList<String> strList = new MyList<>();
strList.add("hello");
strList.add("world");
System.out.println(strList);
MyList<Integer> intList = new MyList<>();
intList.add(1);
intList.add(2);
System.out.println(intList);
String firstStr = MyUtils.getFirst(new String[] {"hello", "world"});
System.out.println(firstStr);
Integer firstInt = MyUtils.getFirst(new Integer[] {1, 2, 3});
System.out.println(firstInt);
}
interface MyList<T> {
void add(T elem);
String toString();
}
static class MyUtils {
public static <T> T getFirst(T[] arr) {
if (arr == null || arr.length == 0) {
return null;
}
return arr[0];
}
}
}
上面的代码中,定义了一个 MyList
接口和一个 MyUtils
类。MyList
接口具有一个类型参数 T
,它表示列表中所存储的元素的类型。MyUtils
类具有一个泛型方法 getFirst
,它接收一个泛型数组类型的参数,并返回数组中的第一个元素。在 main
方法中,分别演示了如何使用 MyList
接口和 MyUtils
类。