关键词搜索

源码搜索 ×
×

一篇文章带你搞定 Java 中受限泛型

发布2020-01-27浏览689次

详情内容

在引用传递中,在泛型操作中也可以设置一个泛型对象的范围上限和范围下限。
范围上限使用 extends 关键字声明,表示参数化的类型可能是所指定的类型或者是此类型的子类,而范围下限使用 super 进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,或是 Object 类

设置上限

声明对象:类名称<? extends> 对象名称
定义类: [访问权限] 类名称<泛型标识 extends>{}

    设置下限

    声明对象:类名称<? super> 对象名称
    定义类: [访问权限] 类名称<泛型标识 extends>{}
    

      一、泛型的上型

      现在假设一个方法中能接收的泛型对象只能是数字(Byte、Short、Long、Integer、Float、Double)类型,此时在定义方法参数接收对象时,就必须指定泛型的上型。因为所有的数字包装类都是 Number 类型的子类:

      public class Test{
          public static void main(String[] args) {
              Info<Integer> i1 = new Info<Integer>();
              Info<Float> i2 = new Info<Float>();
              i1.setVar(30);
              i2.setVar(30.1f);
              fun(i1);
              fun(i2);
          }
          //接收 Info对象,范围上限设置为 Number,所以只能接收数字类型
          public static void fun(Info<? extends Number> temp){
              System.out.println(temp + "、");
          }
      }
      
        3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

      也可以在类的声明处指定泛型的上限范围

      class Info<T extends Number>{//此处泛型只能是数字类型
          private T var;//此变量的类型由外部决定
          public T getVar(){
              return var;//返回值的类型由外部指定
          }
          public void setVar(T var){
              this.var = var;//设置的类型由外部指定
          }
          public String toString(){
              //覆写Object类中的 toString() 方法
              return this.var.toString();
          }
      }
      
        3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

      此时如果声明的泛型对象时 Number 的子类,则肯定不会有任何问题,如果声明的不是数字类型,则肯定会出错

      public class Test{
          public static void main(String[] args) {
              Info<Integer> i1 = new Info<Integer>();
              i1.setVar(30);
              fun(i1);
          }
          //接收 Info对象,范围上限设置为 Number,所以只能接收数字类型
          public static void fun(Info<? extends Number> temp){
              System.out.println(temp + "、");
          }
      }
      
        3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      二、泛型的下限

      当使用的泛型只能在本类及其父类类型上应用时,就必须使用泛型的范围下限进行配置

      class Info<T>{//此处泛型只能是数字类型
          private T var;//此变量的类型由外部决定
          public T getVar(){
              return var;//返回值的类型由外部指定
          }
          public void setVar(T var){
              this.var = var;//设置的类型由外部指定
          }
          public String toString(){
              //覆写Object类中的 toString() 方法
              return this.var.toString();
          }
      }
      public class Test{
          public static void main(String[] args) {
              Info<Object> i1 = new Info<Object>();//满足下限范围
              Info<String> i2 = new Info<String >();//满足下限范围
              i1.setVar(new Object());
              i2.setVar("Java");
              fun(i1);
              fun(i2);
          }
          public static void fun(Info<? super String> temp){//只能接收 String 或 Object 类型的泛型
              System.out.println(temp);
          }
      }
      
        3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26

      这里对 Info 进行了下限的配置,所以只能接收泛型是 String 及 Object 类型的引用。所以,一旦此时传递了其他泛型的对象,编译时将出现错误。

      相关技术文章

      点击QQ咨询
      开通会员
      返回顶部
      ×
      微信扫码支付
      微信扫码支付
      确定支付下载
      请使用微信描二维码支付
      ×

      提示信息

      ×

      选择支付方式

      • 微信支付
      • 支付宝付款
      确定支付下载