java 泛型 -- 泛型类,泛型接口,泛型方法

泛型T
泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束。
在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数。形式类型参数与实际类型参数之间的关系类似于形式方法参数与实际方法参数之间的关系,只是类型参数表示类型,而不是表示值。

有没有可能不指定类型?有没有可能在运行时才知道具体的类型是什么?

所以,就出现了泛型。

eg:
public class Container<K, V> {
private K key;
private V value;

public Container(K k, V v) {
key = k;
value = v;
}

在编译期,是无法知道K和V具体是什么类型,只有在运行时才会真正根据类型来构造和分配内存

一个基本的原则是:无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛化,那么应该有限采用泛型方法

public class Main {

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);
}
}


可以看到方法的参数彻底泛化了,这个过程涉及到编译器的类型推导和自动打包,也就说原来需要我们自己对类型进行的判断和处理,现在编译器帮我们做了。这样在定义方法的时候不必考虑以后到底需要处理哪些类型的参数,大大增加了编程的灵活性。

再看一个泛型方法和可变参数的例子:

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);
}
}

输出和前一段代码相同,可以看到泛型可以和可变参数非常完美的结合。

参考:

Java泛型:泛型类、泛型接口和泛型方法 - findingea - SegmentFault

https://segmentfault.com/a/1190000002646193

Java泛型详解 - Jinuxwu的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/jinuxwu/article/details/6771121/

Java 可变参数 - 蛊惑Into - 博客园
http://www.cnblogs.com/whgw/archive/2011/10/01/2197103.html

原文地址:https://www.cnblogs.com/bluestorm/p/5841505.html