Java中通配符?的使用

作者: Arvin Chen 分类: Java 来源: Break易站(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]
  •   本文标题:Java中通配符?的使用 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/5575.html
    扫描二维码添加微信 
  • ,领取淘宝优惠券,淘宝购物更优惠。现在添加微信,还可以领取机械键盘优惠券!添加微信后,分享淘宝选中的机械键盘给淘宝机器人即可领取!
    支持我们,就用微信淘宝!

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注

    更多阅读