泛型是JDK1.5之后增加。
泛型的本质:数据类型的参数化。我们可以把泛型理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。
没有使用泛型时:
public class Playground {
public static void main(String[] args) {
MyCollection myCollection = new MyCollection();
// 存入容器时不规定类型
myCollection.set("a", 1);
myCollection.set(888, 2);
// 从容器中取出元素时需要转换类型
String s = (String) myCollection.get(1);
int i = (int) myCollection.get(2);
}
}
class MyCollection {
Object[] objects = new Object[5];
public void set(Object object, int index) {
objects[index] = object;
}
public Object get(int index) {
return objects[index];
}
}
使用了泛型后
public class Playground {
public static void main(String[] args) {
// 这里的String就是实际传入的类型,相当于把String赋值给了MyCollection<E>中的E
MyCollection<String> myCollection = new MyCollection<>();
// 现在myCollection只能存放String
myCollection.set("a", 1);
myCollection.set("b", 2);
// 从容器中取出元素时无需类型转换,因为myCollection已经规定了String类型
String s = myCollection.get(1);
}
}
// 在类的声明时,增加泛型 <E>, 也可以有多个泛型如<E, T, V>
// 可以理解为给这个类添加了一个"标签",规定这个类只能处理类型为E的元素
class MyCollection<E> {
Object[] objects = new Object[5];
public void set(E object, int index) {
objects[index] = object;
}
public E get(int index) {
return (E) objects[index];
}
}
java容器中大量使用了泛型,如
public interface List<E> extends Collection<E>
public interface Set<E> extends Collection<E>
public interface Map<K,V>