美文网首页Java
Java通配符

Java通配符

作者: 漆先生 | 来源:发表于2021-03-24 16:24 被阅读0次

参考链接:https://blog.csdn.net/qq_35890572/article/details/80402840

一、符号

java中,?代表通配符,保证类型安全。

二、用法

 1. 在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义

 2. <? extends Object>代表上边界限定通配符

 3. <? super Object>代表下边界限定通配符。

三、上边界限定通配符

上边界通配符使得类型是协变的,直接使用add()方法受限,但是可以用来获取各种数据类型的数据,并赋值给父类型的引用。

List<? extends Number> list=null;
list=new ArrayList<Integer>();
list.add(new Integer(1));    //报错,因为list不能确定实例化的对象具体类型导致add()方法受限
...
list.get(0);    //正确

正确用法:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        firstPrint();
        secondPrint();
    }

    public static void firstPrint() {
        List<Float> list1 = new ArrayList<>();//使用 Float作实参类型
        list1.add(12.3f);
        list1.add(23.4f);
        print(list1);
    }

    public static void secondPrint() {
        List<Integer> list2 = new ArrayList<>();//使用Integer作实参类型
        list2.add(1);
        list2.add(2);
        list2.add(3);
        print(list2);
    }

    public static void print(List<? extends Number> list) {// 通配符作形参
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));// 使用get方法
        }
    }
}

四、下边界限定通配符

下边界通配符使用get()方法受限(不使用强转),但是可以添加特定类型的值,用于将对象写入到一个数据结构里

List<? super Integer> list = null;
list = new ArrayList<Number>();
list.add(1);
Number number = list.get(0);//报错,因为List<? super Integer>不知道list存放的对象具体类型,则使用get获取到的值不确定。
...
list.add(1);//正确

正确用法:

import java.util.ArrayList;
import java.util.List;

public class Main {
   public static void main(String[] args) {
       List<Number> list = new ArrayList<>();
       firstInflate(list);
       for (int i = 0; i < list.size(); i++) {
           System.out.println(list.get(i));
       }
       list.clear();
       secondInflate(list);
       for (int i = 0; i < list.size(); i++) {
           System.out.println(list.get(i));
       }
   }

   public static void firstInflate(List<? super Integer> list) {// 装填整数
       list.add(1);
       list.add(2);
       list.add(3);
   }

   public static void secondInflate(List<? super Float> list) {// 装填浮点数
       list.add(1.1f);
       list.add(2.2f);
       list.add(1.3f);
   }
}

五、总结

  • 列表内容
  • 限定通配符总是包括自己
  • 上边界限定通配符:add方法受限
  • 下边界限定通配符:get方法受限
  • 如果你想从一个数据类型里获取数据,使用 ? extends 通配符
  • 如果你想把对象写入一个数据结构里,使用 ? super 通配符
  • 如果你既想存,又想取,那就别用通配符
  • 不能同时声明泛型通配符上界和下界

相关文章

  • Kotlin型变

    Java的泛型不支持型变,Java采用通配符来解决这个问题;Kotlin采用安全的型变代替了Java的通配符。 一...

  • Java 泛型通配符的思考

    Java中泛型通配符思考 通配符有在Java中有两种 extends , super 两个! 结合Scala中的逆...

  • [Java菜鸟系列] 「林彪」教你"通配符泛型

    J007- [Java菜鸟系列] 「林彪」教你"通配符泛型" 菜鸟:Java方法参数中的泛型通配符要怎么理解?老湿...

  • 快速理解<? extends T>和<? su

    在 Java 泛型中存在通配符的概念: :上界通配符(Upper Bounds Wild...

  • Java通配符

    参考链接:https://blog.csdn.net/qq_35890572/article/details/80...

  • 通配符详解 extends super

    在java泛型中,? 表示通配符,代表未知类型,< ? extends Object>表示上边界限定通配符,< ?...

  • 『Java』泛型中的PECS原则

    Java编程中有时我们要用到不确定的元素,通常用通配符"?"表示,其中" ? extends T "叫"上界通配符...

  • java泛型

    1:问:什么是 Java 泛型中的限定通配符和非限定通配符?有什么区别? 答:限定通配符对类型进行限制,泛型中有两...

  • Java之泛型(2)

    java之泛型(2) 接上一篇使用通配符(?) 通配符在上一篇中没有详细讲通配符的使用,萝卜刚开始学这儿的时候觉得...

  • Android 学习(一):Java 泛型

    Java泛型学习 1.0 泛型常用案例 2.0 泛型方法 3.0 泛型类 4.0 通配符 ? 通配符,占位符,标识...

网友评论

    本文标题:Java通配符

    本文链接:https://www.haomeiwen.com/subject/ozchhltx.html