• Tags ,
  •         
  • www.breakyizhan.com
  •    

    问号(?)在通用编程中称为通配符。它代表一种未知类型。通配符可用于各种情况,例如参数类型,字段或局部变量; 有时作为回归类型。与数组不同,泛型类型的不同实例化彼此不兼容,甚至不是明确的。如果通配符可以软化这种不兼容性?用作实际的类型参数。

    Java中通配符的类型

    1. 上限有界通配符:当您想要放宽对变量的限制时,可以使用这些通配符。例如,假设您要编写一个适用于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类的子类。

    2. 下限通配符:使用通配符('?')表示,后跟super关键字,后跟下限:<?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的超类。

      当您想要在结构中放置值时,如果要从结构和超级通配符中获取值,请使用扩展通配符。在结构中获取并放置值时,请勿使用通配符。

      注意:您可以指定通配符的上限,也可以指定下限,但不能同时指定两者。

    3. 无界通配符:此通配符类型使用通配符(?)指定,例如List。这称为未知类型的列表。这些在以下情况下很有用
      • 编写可以使用Object类中提供的功能的方法时。
      • 当代码使用泛型类中不依赖于类型参数的方法时

      执行:

      //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]

     
    转载请保留页面地址:https://www.breakyizhan.com/java/5575.html