zoukankan      html  css  js  c++  java
  • 泛型程序设计

    Java中的泛型与C++中的模板类似,不过没有template关键字。

    泛型类

    public class Pair<T>
    {
        public Pair() {first = null; second = null;}
        public Pair(T first, T second) {this.first = first; this.second = second;}
        public T getFirst() {return first;}
        public T getSecond() {return second;}
        public void setFirst(T newValue) {first = newValue;}
        public void setSecond(T newValue) {second = newValue;}
        
        private T first;
        private T second;
    }

    泛型方法

    泛型方法可以定义在普通类和泛型类中

    class ArrayAlg
    {
        public static <T> T getMiddle(T[] a)
        {
            return a[a.length/2];
        }
    }

    调用泛型方法:

    String[] names = {"John", "Q.", "Public"};

    String middle = ArrayAlg.<String>getMiddle(names);//实际上,<String>可以省略,Java会根据参数names的类型自动判断。

    有时,需要对泛型中的类型加以约束。例如:

    class ArrayAlg
    {
        public static <T> T min(T[] a)// almost correct
        {
            if(a == null || a.length == 0) return null;
            T smallest = a[0];
            for(int i=1; i<a.length; i++)
                if(smallest.compareTo(a[i]) > 0) smallest = a[i];
            return smallest;
        }
    }

    上面的例子中有一个问题,那就是类型T必须实现了compareTo方法。为了加上这个约束,我们将类型T限制为实现了Comparable接口的类。

    public static<T extends Comparable>T min(T[] a);

    为什么用extends而不用implements?因为这里的约束不仅可以是接口,也可以是类。

    一个类型变量或通配符可以有多个限定。例如:

    T extends Comparable & Serializable

    多个限定中,只能有一个类,可以有多个接口。类必须放在第一个。

    约束与局限性

    不能使用基本类型替换类型参数。因此,没有Pair<double>,只有Pair<Double>,因为类型必须是类。

  • 相关阅读:
    【对拍√】
    hdu5791 TWO
    luogu P1220 关路灯
    【NOI2001】食物链
    【HAOI2016】食物链
    luogu P1006 传纸条
    可持久化平衡树
    可持久化并查集
    线段树合并(【POI2011】ROT-Tree Rotations)
    可持久化数组
  • 原文地址:https://www.cnblogs.com/johnsblog/p/4187218.html
Copyright © 2011-2022 走看看