美文网首页
java泛型(类型通配符)

java泛型(类型通配符)

作者: arkliu | 来源:发表于2022-11-02 09:42 被阅读0次
  • 类型通配符,一般使用"?"来代替具体的类型
  • 类型通配符是类型实参,而不是类型形参

类型通配符的引入

看下面案例:


image.png

使用类型通配符解决上面问题

public static void showBox(Box<?> box) { //使用类型通配符
        Object first = box.getFirst();
        System.out.println(first);
    }
public static void main(String[] args) {
    Box<Number>box1 = new Box<>();
    box1.setFirst(22);
    Box.showBox(box1);
        
    Box<String>box2 = new Box<>();
    box2.setFirst("hello");
    Box.showBox(box2);
}

类型通配符的上限

类型通配符的上限语法

类/接口<? extends 实参类型>
要求该泛型的类型,只能是是实参类型,或实参类型的子类类型
// ? extends Number表示接收的类型为Number或者Number的子类
public static void showBox(Box<? extends Number> box) {
    Number first = box.getFirst();
    System.out.println(first);
}
public static void main(String[] args) {
    Box<Number>box1 = new Box<>();
    box1.setFirst(22);
    Box.showBox(box1);
    
    Box<Integer>box2 = new Box<>();
    box2.setFirst(33);
    Box.showBox(box2);
}

Animal

public class Animal {

}

Cat

public class Cat extends Animal {

}

MiniCat

public class MiniCat extends Cat {

}

Test

public class Test {

    public static void main(String[] args) {
        ArrayList<Animal>animals = new ArrayList<>();
        ArrayList<Cat>cats = new ArrayList<>();
        ArrayList<MiniCat>miniCats = new ArrayList<>();
        
//      showAnimal(animals); error
        showAnimal(cats);
        showAnimal(miniCats);
    }

    /**
     * 泛型上限通配符,传递的集合类型只能是Cat或Cat的子类类型
     */
    public static void showAnimal(ArrayList<? extends Cat> list) {
        for (int i = 0; i < list.size(); i++) {
            Cat cat = list.get(i);
            System.out.println(cat);
        }
    }
}

类型通配符下限

类型通配符下限语法

类/接口<? super 实参类型>
要求该泛型的类型,只能是实参类型,或实参类型的父类类型
/**
 * 类型通配符的下限要求,要求只能是Cat或者Cat的父类类型
 */
public static void showAnimal(List<? super Cat> list) {
    for (Object obj : list) {
        System.out.println(obj);
    }
}

ArrayList<Animal>animals = new ArrayList<>();
ArrayList<Cat>cats = new ArrayList<>();
ArrayList<MiniCat>miniCats = new ArrayList<>();

showAnimal(animals); 
showAnimal(cats);
// showAnimal(miniCats); // error

相关文章

  • Java泛型食用笔记(四) -- 通配符

    Java泛型食用笔记(四) -- 通配符 1. 三种通配符 通配符为一个泛型类所指定的类型集合提供了一个有用的类型...

  • java泛型

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

  • 通配符详解 extends super

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

  • Android 学习(一):Java 泛型

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

  • java基础知识梳理&泛型初探

    目录 概述 范型的使用 类型参数 类型通配符 泛型方法 泛型类 限定类型参数上限 上界通配符(Upper Boun...

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

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

  • JAVA 泛型 边界 通配符

    泛型类 带有边界符的泛型方法 通配符,只读通配符,list 只接收T类型的子类或者T类型本身作为参数 只写通配符

  • 泛型程序设计---通配符类型

    1.通配符概念  通配符类型中,允许类型参数变化。例如,通配符类型  表示任何泛型类型Pair类型,它的类型参数是...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

  • java基础

    八、泛型 面试题==什么是泛型中的限定通配符和非限定通配符 ?这是另一个非常流行的Java泛型面试题。限定通配符对...

网友评论

      本文标题:java泛型(类型通配符)

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