Java中的泛型是一种强大的特性,它允许我们在定义类、接口和方法时使用参数化类型,从而实现代码的重用和类型安全。在泛型中,我们经常会遇到一些特殊的符号,如“&”和“,”。这两个符号在泛型中的使用有一些区别,下面我们来详细介绍一下。
在Java泛型中,使用“&”符号表示多个类型的交集。它可以用于限制泛型参数的类型范围,使其必须是多个类型中的一个。这种用法称为泛型的上界限定。例如,我们定义一个泛型方法findMax,要求传入的参数必须是Number及其子类:javapublic在上面的代码中,我们使用了“extends”关键字来限制泛型参数的类型范围,表示泛型参数必须是Number类或其子类。这样,在调用findMax方法时,我们可以传入Integer、Double等Number的子类的数组。而在泛型中使用“,”符号表示多个类型的并集。它可以用于限制泛型参数的类型范围,使其必须是多个类型中的任意一个。这种用法称为泛型的下界限定。例如,我们定义一个泛型方法printList,要求传入的参数必须是List及其子类,且元素的类型必须是Number及其子类: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;}
javapublic在上面的代码中,我们使用了通配符“?”来表示List中的元素类型可以是Number的任意子类。这样,在调用printList方法时,我们可以传入ArrayList> void printList(T list) { for (Number number : list) { System.out.println(number); }}
javapublic 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泛型中的使用有更清晰的理解。