编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

Java自定义泛型

上一小节讲解了在集合上如何使用泛型,那么在程序中是否能自定义泛型呢? 假设要实现一个简单的容器,用于缓存程序中的某个值,此时在这个容器类中势必要定义两个方法save()和get(),一个用于保存数据,另一个用于取出数据,这两个方法的定义如下:

void save(参数类型参数){……}
返回值参数类型get(){……}

为了能存储任意类型的对象,save()方法的参数需要定义为Object类型,同样get()方法的返回值也需要是Object类型。但是当使用get()方法取出这个值时,有可能忘记当初存储的是什么类型的值,在取出时将其转换为String类型,这样程序就会发生错误。这种错误是很麻烦的,为了避免这个问题,就可以使用泛型。

如果在定义一个类CachePool时使用<T>声明参数类型(T 其实就是Type的缩写,这里也可以使用其他字符,为了方便理解都定义为T),将save()方法的参数类型和get()方法的返回值类型都声明为T,那么在存入元素时元素的类型就被限定了,容器中就只能存入这种T 类型的元素,在取出元素时就无须进行类型转换。接下来通过一个案例来看一下如何自定义泛型,如:

class cachePool<T> { // 在创建类时,声明参数类型为T
    T temp;
    public void save(T temp) { // 在创建save()方法时,指定参数类型为T
        this.temp = temp;
    }
    public T get() { // 在创建get()方法时,指定返回值类型为T
        return temp;
    }
}
public class Example {
    public static void main(String[] args) {
        // 在实例化对象时,传入参数为Integer 类型
        cachePool<Integer> pool = new cachePool<Integer>();
        pool.save(new Integer(1));
        Integer temp = pool.get();
        System.out.println(temp);
    }
}

运行结果:

1

例中,在定义CachePool类时,声明了参数类型为T,在实例化对象时通过<Integer>将参数T 指定为Integer类型,同时在调用save()方法时传入的数据也是Integer类型,那么调用get()方法取出的数据自然就是Integer类型,这样做的好处是不需要进行类型转换。

未经允许不得转载: 技术文章 » Java编程 » Java自定义泛型

专注编程入门及提高,探究程序员职业规划之道!