泛型Java

泛型程序设计

普通的类和方法只能使用特定的类型:基本数据类型或类类型。如果编写的代码需要应用于多种类型,这种严苛的限制对代码的束缚就会很大。

随着泛型的引入,Java有了一个表述能力很强的类型系统,允许设计者详细地描述变量和方法的类型要如何变化。泛型程序设计(generic programming)意味着编写的代码可以对多种不同类型的对象重用。

类型参数的好处

在Java中增加泛型类之前,泛型程序设计是用继承实现的。ArrayList类只维护一个Object引用数组:

public class ArrayList//泛型之前
{
private Object[] elemrntData;
...
public Object get(int i){...}
public void add(Object o){...}
}

这种方法存在两个问题。当获取一个值的时候必须进行强制类型转换。

ArrayList files = new ArrayList();

...

String filename = (String)files.get(0);

此外没有错误检查,可以向数组列表添加任意类型的的值。

files.add(new File("..."));

虽然该调用编译和运行都不会出错,但是当将get结果强制转换成String就会出错。

泛型提供了更好的解决方案:类型参数。ArrayList类有一个类型参数用来指示元素的类型:

ArrayList<String> files = new ArrayList<>();

省略的类型可以从变量的类型推断得出,编译器也可以充分利用这个类型信息。调用get的时候就可以不用强制类型转换了,编译器知道返回值类型是String,而不是Object。

而且此时可以检查,防止插入错误的对象。

定义泛型类

泛型类就是有一个或多个类型变量的类,这个类可以使得我们只关注类型而不用为数据存储的细节而分心。下面是泛型Pair类的代码:

package com.xu.generics;

public class Pair<T> {
    private T first;
    private T second;

    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) {
        this.first = newValue;
    }

    public void setSecond(T newValue) {
        this.second = newValue;
    }
}
package com.xu.generics;

import java.util.ArrayList;

public class Demo01 {
    public static void main(String[] args) {
        Pair<String> pair1 = new Pair<>();
        Pair<String> pair2 = new Pair<>("study", "java");
        System.out.println("pair1:" + pair1.getFirst() + pair1.getSecond());
        System.out.println("pair2:" + pair2.getFirst() + " " + pair2.getSecond());
        pair1.setFirst("ok");
        pair1.setSecond("ko");
        System.out.println("新的pair1:" + pair1.getFirst() + pair1.getSecond());
        Pair<Integer> number = new Pair<>(10, 66);
        System.out.println("Integer型的pair:");
        System.out.println(number.getFirst());
        System.out.println(number.getSecond());
    }
}

运行结果:

pair1:nullnull
pair2:study java
新的pair1:okko
Integer型的pair:
10
66

Process finished with exit code 0

比较字符串

package com.xu.generics;

public class PairTest1 {
    public static void main(String[] args) {
        String[] words={"Mary","Bob","Jack","Dog","Hello"};
        Pair<String> mm = ArrayAlg.minmax(words);
        System.out.println("min="+mm.getFirst());
        System.out.println("max="+mm.getSecond());
    }
}

class ArrayAlg {
    /**
     * 获得最小最大的字符串
     * @param a 字符串数组
     * @return 一个Pair(最小 , 最大)或空(null)
     */
    public static Pair<String> minmax(String[] a) {
        if (a == null || a.length == 0) return null;
        String min = a[0];
        String max = a[0];
        for (int i = 1; i < a.length; i++) {
            if (min.compareTo(a[i]) > 0) {
                min = a[i];
            }
            if (max.compareTo(a[i]) < 0) {
                max = a[i];
            }
        }
        return new Pair<>(min,max);
    }
}

运行结果:

min=Bob
max=Mary

Process finished with exit code 0
posted @ 2022-02-11 19:05  奈若何!?  阅读(25)  评论(0)    收藏  举报