个性化阅读
专注于IT技术分析

Java中的通配符解读和用法指南

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

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]

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

赞(0)
未经允许不得转载:srcmini » Java中的通配符解读和用法指南

评论 抢沙发

评论前必须登录!