Java中的通配符解读和用法指南

问号(?)在通用编程中被称为通配符。它代表未知类型。通配符可用于多种情况, 例如参数的类型, 字段或局部变量;有时作为返回类型。与数组不同, 泛型类型的不同实例彼此之间不兼容, 甚至不明确兼容。如果不兼容, 通配符可以缓解这种不兼容性。用作实际的类型参数。
Java中的通配符类型:
上界通配符:
当你想放宽对变量的限制时, 可以使用这些通配符。例如, 假设你要编写一种适用于List < integer> , List < double> 和List < number> 的方法, 则可以使用上限通配符来实现。
要声明上限通配符, 请使用通配符(‘ ?’ ), 后接extends关键字, 然后是其上限。

public static void add(List< ? extends Number> list)

实现
//Java program to demonstrate Upper Bounded Wildcards import java.util.Arrays; import java.util.List; class WildcardDemo { public static void main(String[] args) {//Upper Bounded Integer List List< Integer> list1= Arrays.asList( 4 , 5 , 6 , 7 ); //printing the sum of elements in list System.out.println( "Total sum is:" +sum(list1)); //Double list List< Double> list2=Arrays.asList( 4.1 , 5.1 , 6.1 ); //printing the sum of elements in list System.out.print( "Total sum is:" +sum(list2)); }private static double sum(List< ? extends Number> list) { double sum= 0.0 ; for (Number i: list) { sum+=i.doubleValue(); }return sum; } }

输出如下:
Total sum is:22.0 Total sum is:15.299999999999999

在上面的程序中, list1和list2是List类的对象。 list1是Integer的集合, 而list2是Double的集合。它们都被传递给方法sum, 该方法具有扩展Number的通配符。这意味着要传递的列表可以是任何字段或该字段的子类。在这里, Integer和Double是Number类的子类。
下界通配符:
它使用通配符(‘ ?’ ), super关键字和下限表示:< ?超级A> 。
Syntax: Collectiontype < ? super A>

实现
//Java program to demonstrate Lower Bounded Wildcards import java.util.Arrays; import java.util.List; class WildcardDemo { public static void main(String[] args) { //Lower Bounded Integer List List< Integer> list1= Arrays.asList( 4 , 5 , 6 , 7 ); //Integer list object is being passed printOnlyIntegerClassorSuperClass(list1); //Number list List< Number> list2= Arrays.asList( 4 , 5 , 6 , 7 ); //Integer list object is being passed printOnlyIntegerClassorSuperClass(list2); }public static void printOnlyIntegerClassorSuperClass(List< ? super Integer> list) { System.out.println(list); } }

输出如下:
[4, 5, 6, 7] [4, 5, 6, 7]

这里的参数可以是Integer或Integer的超类(即Number)。方法printOnlyIntegerClassorSuperClass将仅接受Integer或其超类对象。但是, 如果我们传递D??ouble类型的列表, 则将得到编译错误。这是因为只能传递Integer字段或其超类。 Double不是Integer的超类。
如果要从结构中获取值, 请使用扩展通配符;将值放入结构中时, 请使用超级通配符。在结构中获取值并将其放入结构时, 请勿使用通配符。
注意:你可以为通配符指定一个上限, 也可以指定一个下限, 但是不能同时指定两者。
无限通配符:
使用通配符(?)(例如, 列表)指定此通配符类型。这称为未知类型列表。这些在以下情况下很有用
  • 编写可以使用Object类提供的功能使用的方法时。
  • 当代码使用通用类中不依赖于type参数的方法时
实现
//Java program to demonstrate Unbounded wildcard import java.util.Arrays; import java.util.List; class unboundedwildcardemo { public static void main(String[] args) {//Integer List List< Integer> list1= Arrays.asList( 1 , 2 , 3 ); //Double list List< Double> list2=Arrays.asList( 1.1 , 2.2 , 3.3 ); printlist(list1); printlist(list2); }private static void printlist(List< ?> list) {System.out.println(list); } }

输出如下:
[1, 2, 3] [1.1, 2.2, 3.3]

【Java中的通配符解读和用法指南】如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

    推荐阅读