Java 泛型基础

  |   0 评论   |   19 浏览

使用泛型的好处?

参数化类型,使得编译器可以在编译时检查类型,避免强制类型转换。

泛型类

package com.test;
public class Result<T> {
    private T data;
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}

实例化时指定类型参数

Result<String> result = new Result<String>();
result.setData("abc");
String data = result.getData();

泛型不支持协变

Object obj = new String();// 正确
Result<Object> res = new Result<Object>();// 正确
Result<Object> res = new Result<String>();// 错误

数组支持协变

这是Java的一个缺陷,没人知道Java为什么要这么设计。
这段代码可以通过编译,但是在运行时却会报错。

Number[] num = new Integer[5];
num[0] = 5;// 正确
num[1] = 2.3;// 错误

类型擦除

泛型的类型检查是在编译阶段完成的,编译后的class字节码文件中是不包含类型信息的。

public class Result<T> {
    // 类型擦除后T类型实际为Object
    private T data;
    private void doSomething() {
        // 所以仅能作为Object类型来使用
        data.toString();
    }
}

泛型方法

将数组转换成集合

static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
    for (T o : a) {
        c.add(o);
    }
}

泛型接口

java.lang.Comparable     将自身和两外一个对象进行比较,小返回-1,等于返回0,大于返回1

public interface Comparable<T> {
    public int compareTo(T o);
}

使用泛型接口的好处是:通用性强,可以比较多种类型
java.lang.Integer

public final class Integer extends Number implements Comparable<Integer> {
    // ignore
    public int compareTo(Integer anotherInteger) {
        return compare(this.value, anotherInteger.value);
    }
    
    public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }
    // ignore
}

评论