4.0、Java泛型 - 类型通配符以及上限与下限

4.0、Java泛型 - 类型通配符以及上限与下限

什么是类型通配符:

        类型通配符一般是使用 " ? " 代替具体的类型实参;

        所以,类型通配符是类型实参,而不是类型形参

话不多说直接上代码理解 ->

先创建一个 Box.java 类:

public class Box<E> {

    private E first;

    public E getFirst() {
        return first;
    }

    public void setFirst(E first) {
        this.first = first;
    }

}

创建一个 Test.java 测试类:

        showBox() 方法中的 Box<> 这里如果写 Number、Integer 的话就只能传递 Number 或者 Integer 类型,但是如果写成 ? 就表示任意类型 ->

public class Test {

    //Box<>这里如果写Number、Integer的话就只能传递Number或者Integer类型,但是如果写成 ? 就表示任意类型
    public static void showBox(Box<?> box) { 
        Object first = box.getFirst();//由于 ? 表示任意类型所以这里只能用 Object 来接收
        System.out.println(first);
    }

    public static void main(String[] args) {
        Box<Number> box1 = new Box<Number>();
        box1.setFirst(100);
        showBox(box1);
        
        Box<Integer> box2 = new Box<Integer>();
        box2.setFirst(200);
        showBox(box2);
    }
}

类型通配符的上限

语法 ->

类 / 接口<? extends 实参类型>;

要求该泛型的类型,只能是实参类型,或实参类型的子类类型;

<? extends Number> 表示 Number 类型以及 Number 的子类都可以,所以是上限 ->

public class Test {

    public static void showBox(Box<? extends Number> box) { 
        Number first = box.getFirst();//由于 "? extends Number" 表示 Number 以及 Number的子类都可,所以这里可以用 Number来接收
        System.out.println(first);
    }

    public static void main(String[] args) {
        Box<Number> box1 = new Box<Number>();
        box1.setFirst(100);
        showBox(box1);
        
        Box<Integer> box2 = new Box<Integer>();
        box2.setFirst(200);
        showBox(box2);
    }
}

类型通配符的下限

语法:

类 / 接口 <? super 实参类型>

要求该泛型的类型,只能是实参类型,或实参类型的父类类型

<? super Integer > 表示 Integer 类型以及 Integer 的父类都可以,所以是下限 ->

public class Test {

    public static void showBox(Box<? super Integer> box) { 
        Integer first = box.getFirst();//由于 "? super Integer" 表示 Integer 以及 Integer 的父类都可,所以这里可以用 Integer 来接收
        System.out.println(first);
    }

    public static void main(String[] args) {
        Box<Number> box1 = new Box<Number>();
        box1.setFirst(100);
        showBox(box1);
        
        Box<Integer> box2 = new Box<Integer>();
        box2.setFirst(200);
        showBox(box2);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值