📜  Java中的通配符

📅  最后修改于: 2022-05-13 01:54:21.562000             🧑  作者: Mango

Java中的通配符

问号 (?)在泛型编程中被称为通配符。它代表一种未知类型。通配符可用于多种情况,例如参数、字段或局部变量的类型;有时作为返回类型。与数组不同,泛型类型的不同实例彼此不兼容,甚至不显式兼容。如果 ?用作实际类型参数。

Java中的通配符类型

1. 上界通配符:

当您想放松对变量的限制时,可以使用这些通配符。例如,假设您要编写一个适用于 List、List 和 List 的方法,您可以使用上限通配符来执行此操作。

要声明上限通配符,请使用通配符( '?'),后跟 extends 关键字,然后是其上限。

public static void add(List 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 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 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 

执行:

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 list)
    {
        System.out.println(list);
    }
}
输出
[4, 5, 6, 7]
[4, 5, 6, 7]

解释:

这里的参数可以是整数或整数的超类(即数字)。方法 printOnlyIntegerClassorSuperClass 将只接受 Integer 或其超类对象。但是,如果我们传递一个 Double 类型列表,那么我们将得到一个编译错误。这是因为只能传递 Integer 字段或其超类。 Double 不是 Integer 的超类。

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]