问号(?)在通用编程中被称为通配符。它代表未知类型。通配符可用于多种情况, 例如参数的类型, 字段或局部变量;有时作为返回类型。与数组不同, 泛型类型的不同实例彼此之间不兼容, 甚至不明确兼容。如果不兼容, 通配符可以缓解这种不兼容性。用作实际的类型参数。
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或其超类对象。但是, 如果我们传递Double类型的列表, 则将得到编译错误。这是因为只能传递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]
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。
评论前必须登录!
注册