欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于泛型的一些理解

程序员文章站 2024-03-14 18:14:46
...

什么是泛型

Java泛型(generics)是JDK 5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许程序员在编译时监测非法的类型。使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性

泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。

这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

泛型类

在声明类的时候就指定了参数,这就叫做泛型类,

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

这是ArrayList的声明,这里的<E>就是泛型,E就是类型参数,然后在这里类里就可以直接使用这个类型了,比如

 public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

    public E set(int index, E element) {
        rangeCheck(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

 

泛型接口

泛型接口和泛型类基本相同

public interface Generator<T> {
    public T add();
}

泛型方法

判断一个方法是不是泛型方法,只要看方法的返回值类型前是否有<>,这个<>里的类型相当于为这个方法声明了一个类型,在方法体内可以任意使用

package com.collection;

public class Generic<T> {
    public T user;

    public Generic(T user) {
        this.user = user;
    }

    public T test1(){
        return user;
    }

    public <E> void test2(E e){
        System.out.println(e.getClass().getSimpleName());
    }

    public <T> String test3(T t){
        return t.getClass().getSimpleName();
    }

    public static void main(String[] args){
        Generic<User> generic = new Generic<>(new User());

        System.out.println(generic.test1());
        generic.test2("这是一个String类型的参数");
        System.out.println(generic.test3(1));
    }
}
class User{
    @Override
    public String toString() {
        return "User{}";
    }
}

在上面的代码里,Generic是一个泛型类,test1是调用了泛型的普通方法,test2就是标准的泛型方法,在public和String之间有一个<>。test3也是泛型方法,这里的T和Generic<T>里的T不是同一个,在调用的时候会使用泛型方法里的T。

关于泛型的一些理解

在main方法里调用三个test方法,输出结果为

关于泛型的一些理解

在创建对象的时候,声明了T就是User,然后传入了一个User的实例,调用构造方法,将一个User对象赋值给user。

Generic<User> generic = new Generic<>(new User());

然后调用test1的时候,会返回一个uesr对象,输出时调用toString。

test2和test3都是通过反射来获取具体的泛型类型,调用test2时传入了一个字符串,所以test2会直接输出String类型,test3里的T并不是创建对象时所传入的User,而是调用test3方法时传入的具体参数类型,测试用例中传入的是 1 ,所以会输出Integer。

相关标签: java