关于泛型的一些理解
什么是泛型
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。
上一篇: 关于一些暴力的事情:枚举(1)
下一篇: 对Class使用泛型语法的一些问题