• Java面向对象设计 - Java泛型约束


    Java面向对象设计 - Java泛型约束

    无限通配符

    通配符类型由问号表示,如<?> 。

    对于通用类型,通配符类型是对象类型用于原始类型。

    我们可以将任何已知类型的泛型分配为通配符类型。

    这里是示例代码:

    // MyBag  of  String type
    MyBag stringMyBag  = new MyBag("Hi");
    
    // You can  assign a  MyBag to  MyBag type
    MyBag wildCardMyBag  = stringMyBag;
    

    通配符通配类型中的问号(例如,<?>)表示未知类型。

    当您使用通配符声明参数化类型作为参数类型时,这意味着它不知道它的类型。

    MyBag unknownMyBag = new MyBag("Hello");
    

    上限通配符

    我们表示通配符的上限

    
    

    这里,T是一种类型。<? extends T>表示任何类型为T或其子类是可接受的。

    例如,上限可以是数字类型。

    如果我们通过任何其他类型,该类型是数字类型的子类,很好。但是,不是Number类型或其子类型的任何东西都应该在编译时被拒绝。

    使用上限作为数字,我们可以将方法定义为

    class MyBag {
      private T ref;
    
      public MyBag(T ref) {
        this.ref = ref;
      }
    
      public T get() {
        return ref;
      }
    
      public void set(T a) {
        this.ref = a;
      }
    }
    
    public class Main {
      public static double sum(MyBag n1,
          MyBag n2) {
        Number num1 = n1.get();
        Number num2 = n2.get();
        double sum = num1.doubleValue() + num2.doubleValue();
        return sum;
      }
    
    }
    

    不管你为n1和n2传递什么,它们将始终与Number的赋值兼容,因为编译器确保传递给sum()方法的参数遵循其声明中指定的规则

    下限通配符

    指定下限通配符与指定上限通配符相反。

    使用下限通配符的语法是<? super T>,这意味着“任何是T的超类型”。

    class MyBag {
      private T ref;
    
      public MyBag(T ref) {
        this.ref = ref;
      }
    
      public T get() {
        return ref;
      }
    
      public void set(T a) {
        this.ref = a;
      }
    }
    public class Main {
      public static  void copy(MyBag source, MyBag dest) {
        T value = source.get();
        dest.set(value);
      }
    }
    

    以上内容

  • 相关阅读:
    LinkedList简介
    最短路径——通过Dynamo批量创建行进路线
    CentOS下对安装不同ModSecurity版本的Nginx的并发性能测试
    283. 移动零
    我大抵是卷上瘾了,横竖睡不着!竟让一个Bug,搞我两次!
    CVPR2022Oral专题系列(三):图像增强主干网络MAXIM
    JVM内存模型
    像你这么优秀的测试工程师,为什么连面试都过不了?
    C++11新特性 auto
    8.3:加强堆的应用
  • 原文地址:https://blog.csdn.net/2301_78772942/article/details/139756136