问号(?)在通用编程中被称为通配符。它代表未知类型。通配符可用于多种情况, 例如参数的类型, 字段或局部变量;有时作为返回类型。与数组不同, 泛型类型的不同实例彼此之间不兼容, 甚至不明确兼容。如果不兼容, 通配符可以缓解这种不兼容性。用作实际的类型参数。
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中的通配符解读和用法指南】如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。
推荐阅读
- C++ wmemmove()函数用法介绍和示例
- 算法题(具有三个符号(*,+,?)的通配符模式匹配)
- 算法设计(如何实现通配符模式匹配())
- 算法题(字符串匹配,其中一个字符串包含通配符)
- Windows/Linux中所有已连接网络的Wi-Fi密码
- 算法设计(求二叉树的垂直宽度|S1)
- 为什么strcpy和strncpy使用不安全()
- 为什么快速排序首选用于数组,而合并排序首选用于链表()
- 桌豪OSD系统部署--上卷