Java 泛型中的“&”和“,”有什么区别

作者:编程家 分类: java 时间:2025-11-14

Java中的泛型是一种强大的特性,它允许我们在定义类、接口和方法时使用参数化类型,从而实现代码的重用和类型安全。在泛型中,我们经常会遇到一些特殊的符号,如“&”和“,”。这两个符号在泛型中的使用有一些区别,下面我们来详细介绍一下。

在Java泛型中,使用“&”符号表示多个类型的交集。它可以用于限制泛型参数的类型范围,使其必须是多个类型中的一个。这种用法称为泛型的上界限定。例如,我们定义一个泛型方法findMax,要求传入的参数必须是Number及其子类:

java

public T findMax(T[] array) {

T max = array[0];

for (int i = 1; i < array.length; i++) {

if (array[i].doubleValue() > max.doubleValue()) {

max = array[i];

}

}

return max;

}

在上面的代码中,我们使用了“extends”关键字来限制泛型参数的类型范围,表示泛型参数必须是Number类或其子类。这样,在调用findMax方法时,我们可以传入Integer、Double等Number的子类的数组。

而在泛型中使用“,”符号表示多个类型的并集。它可以用于限制泛型参数的类型范围,使其必须是多个类型中的任意一个。这种用法称为泛型的下界限定。例如,我们定义一个泛型方法printList,要求传入的参数必须是List及其子类,且元素的类型必须是Number及其子类:

java

public > void printList(T list) {

for (Number number : list) {

System.out.println(number);

}

}

在上面的代码中,我们使用了通配符“?”来表示List中的元素类型可以是Number的任意子类。这样,在调用printList方法时,我们可以传入ArrayList、LinkedList等List的子类对象。

使用“&”和“,”的区别

在泛型中,使用“&”和“,”都可以用于限制泛型参数的类型范围,但二者之间有一些区别。

首先,使用“&”时,泛型参数必须是多个类型中的一个,即必须是交集中的类型。而使用“,”时,泛型参数可以是多个类型中的任意一个,即可以是并集中的类型。

其次,使用“&”时,泛型参数的类型范围更加具体,即更加严格。而使用“,”时,泛型参数的类型范围相对较宽松。

最后,使用“&”时,泛型参数的类型范围是从左到右解析的,即先解析左边的类型,再解析右边的类型。而使用“,”时,泛型参数的类型范围是无序的,即可以任意组合。

案例代码

下面我们通过一个案例代码来进一步说明使用“&”和“,”的区别。

java

public class GenericExample {

public static void main(String[] args) {

List integerList = new ArrayList<>();

integerList.add(1);

integerList.add(2);

integerList.add(3);

List doubleList = new LinkedList<>();

doubleList.add(1.0);

doubleList.add(2.0);

doubleList.add(3.0);

printListWithAnd(integerList); // 编译通过,使用"&"限制元素类型为Number及其子类

printListWithAnd(doubleList); // 编译错误,元素类型不满足限制

printListWithComma(integerList); // 编译通过,使用","限制元素类型为Number及其子类

printListWithComma(doubleList); // 编译通过,元素类型满足限制

}

public static > void printListWithAnd(T list) {

for (Number number : list) {

System.out.println(number);

}

}

public static , U extends Number> void printListWithComma(T list) {

for (U number : list) {

System.out.println(number);

}

}

}

在上面的代码中,我们定义了一个GenericExample类,其中包含了两个泛型方法printListWithAnd和printListWithComma。printListWithAnd方法使用了“&”符号,限制了泛型参数的类型范围为List及其子类,且元素的类型必须是Number及其子类。printListWithComma方法使用了“,”符号,限制了泛型参数的类型范围为List及其子类,同时还额外限制了元素的类型必须是Number或Number的子类。

在main方法中,我们分别创建了一个Integer类型的List和一个Double类型的List,并分别调用了printListWithAnd和printListWithComma方法。结果发现,对于printListWithAnd方法,只有传入Integer类型的List时才能通过编译,而对于printListWithComma方法,无论传入Integer类型的List还是Double类型的List都能通过编译。

这就是使用“&”和“,”的区别,希望通过这篇文章的介绍和案例代码的演示,可以对这两个符号在Java泛型中的使用有更清晰的理解。