- 在面向对象编程语言中,多态算是一种泛化机制。
- 泛型实现了参数化类型的概念,使代码可以应用于多种类型。“泛型”这个术语的意思是:“适用于许多许多类型”。
- 对Java而言,泛型确实是一种很有益的补充。在你创建参数化类型的一个实例时,编译器会为你负责转型操作,并且保证类型的正确性。
2. 简单泛型
- 泛型的主要目的之一就是用来制定容器要持有什么类型的对象,而且由编译器来保证类型的正确性。
- Java泛型的核心概念:告诉编译器想使用什么类型,然后编译器帮你处理一切细节。
- 元组,它是将一组对象直接打包存储于其中一个单一对象。这个容器对象允许读取其中元素,但是不允许向其中存放新的对象。
- final声明能够保护public元素。
public class TwoTuple<A,B>{
public final A first;
public final B second;
public TwoTuple(A a,B b){
first = a;
second = b;
}
}
- 有了泛型,就可以很容易创建元组,令其返回一组任意类型的对象。
- 可以利用继承机制实现长度更长的元组。
3. 泛型接口
- Java泛型的一个局限性:基本类型无法作为类型参数。不过,Java具备了自动打包和自动拆包的功能,可以很方便地在基本类型和其相应的包装器类型之间进行转换。
4. 泛型方法
- 泛型可应用于整个类上,同样可以在类中包含参数化方法,而这个方法所在的类可以是泛型类,也可以不是泛型类。也就是说,是否拥有泛型方法,与其所在的类是否是泛型没有关系。
- 泛型方法使得该方法能够独立于类而产生变化。无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法,因为它可是使事情更清楚明白。另外,对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。
- 当使用泛型类时,必须在创建对象的时候指定类型参数的值,而使用泛型方法的时候,通常不必指明参数类型,因为编译器会为我们找出具体类型,这称为类型参数推断。
- 类型推断只对赋值操作有效,其他时候并不起作用。如果你将一个泛型方法调用的结果作为参数,传递给另一个方法,这时编译器并不会执行类型推断。在这个情况下,编译器认为:调用泛型方法后,其返回值被赋给一个Object类型的变量。