Java中的通配符
问号 (?)在泛型编程中被称为通配符。它代表一种未知类型。通配符可用于多种情况,例如参数、字段或局部变量的类型;有时作为返回类型。与数组不同,泛型类型的不同实例彼此不兼容,甚至不显式兼容。如果 ?用作实际类型参数。
Java中的通配符类型
1. 上界通配符:
当您想放松对变量的限制时,可以使用这些通配符。例如,假设您要编写一个适用于 List
要声明上限通配符,请使用通配符( '?'),后跟 extends 关键字,然后是其上限。
public static void add(List extends Number> list)
执行:
Java
// 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 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 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;
}
}
Java
// 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 list1 = Arrays.asList(4, 5, 6, 7);
// Integer list object is being passed
printOnlyIntegerClassorSuperClass(list1);
// Number list
List 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);
}
}
Java
// 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 list1 = Arrays.asList(1, 2, 3);
// Double list
List list2 = Arrays.asList(1.1, 2.2, 3.3);
printlist(list1);
printlist(list2);
}
private static void printlist(List> list)
{
System.out.println(list);
}
}
Total sum is:22.0
Total sum is:15.299999999999999
解释:
在上面的程序中,list1 和 list2 是 List 类的对象。 list1 是 Integer 的集合,list2 是 Double 的集合。它们都被传递给方法 sum,该方法有一个扩展 Number 的通配符。这意味着传递的列表可以是该字段的任何字段或子类。这里,Integer 和 Double 是 Number 类的子类。
2. 下界通配符:
它使用通配符 ('?')字符,后跟 super 关键字,然后是其下限:。
Syntax: Collectiontype super A>
执行:
Java
// 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 list1 = Arrays.asList(4, 5, 6, 7);
// Integer list object is being passed
printOnlyIntegerClassorSuperClass(list1);
// Number list
List 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]
解释:
这里的参数可以是整数或整数的超类(即数字)。方法 printOnlyIntegerClassorSuperClass 将只接受 Integer 或其超类对象。但是,如果我们传递一个 Double 类型列表,那么我们将得到一个编译错误。这是因为只能传递 Integer 字段或其超类。 Double 不是 Integer 的超类。
Note: Use extend wildcard when you want to get values out of a structure and super wildcard when you put values in a structure. Don’t use wildcard when you get and put values in a structure. You can specify an upper bound for a wildcard, or you can specify a lower bound, but you cannot specify both.
3. 无界通配符:
此通配符类型使用通配符( ?) 指定,例如 List。这称为未知类型列表。这些在以下情况下很有用 -
- 在编写可以使用 Object 类中提供的功能使用的方法时。
- 当代码使用不依赖于类型参数的泛型类中的方法时
执行:
Java
// 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 list1 = Arrays.asList(1, 2, 3);
// Double list
List 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]