泛型T
泛型的许多最佳例子都来自集合框架,由于泛型让您在保存在集合中的元素上指定类型约束。
在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数。形式类型参数与实际类型参数之间的关系相似于形式方法参数与实际方法参数之间的关系,只是类型参数表示类型,而不是表示值。java
有没有可能不指定类型?有没有可能在运行时才知道具体的类型是什么?编程
因此,就出现了泛型。框架
eg:
public class Container<K, V> {
private K key;
private V value;ide
public Container(K k, V v) {
key = k;
value = v;
}接口
在编译期,是没法知道K和V具体是什么类型,只有在运行时才会真正根据类型来构造和分配内存内存
一个基本的原则是:不管什么时候,只要你能作到,你就应该尽可能使用泛型方法。也就是说,若是使用泛型方法能够取代将整个类泛化,那么应该有限采用泛型方法编译器
public class Main {it
public static <T> void out(T t) {
System.out.println(t);
}编译
public static void main(String[] args) {
out("findingsea");
out(123);
out(11.11);
out(true);
}
}class
能够看到方法的参数完全泛化了,这个过程涉及到编译器的类型推导和自动打包,也就说原来须要咱们本身对类型进行的判断和处理,如今编译器帮咱们作了。这样在定义方法的时候没必要考虑之后到底须要处理哪些类型的参数,大大增长了编程的灵活性。
再看一个泛型方法和可变参数的例子:
public class Main {
public static <T> void out(T... args) {
for (T t : args) {
System.out.println(t);
}
}
public static void main(String[] args) {
out("findingsea", 123, 11.11, true);
}
}
输出和前一段代码相同,能够看到泛型能够和可变参数很是完美的结合。