在这里只讲解Java泛型基础知识以供了解Java泛型
一.概念:
泛型是jdk5引入的,在两个重要方面改变了Java。首先泛型增加了新的语法元素。其次,泛型改变了核心API中许多类和方法。
简单来说,对于许多不同的数据类型,算法逻辑是相同的。例如,不管堆栈存储的数据类型是Integer、Object、String、还是Thread,支持堆栈的机制是相同的。使用泛型可以之定义算法一次,使其独立于特定的数据类型,提高算法的复用性。
就本质而言,“泛型”的意思是“参数化类型”。使用该特性创建的方法、类或者接口可以作为参数所指定的操作数据的类型。
在Java提供泛型机制之前的代码,一般化的类、接口、方法通过Object引用来操纵各种不同类型的对象,问题是他们不能以类型安全的方式工作。
泛型提供了以前缺失的类型安全性,并且可以简化处理过程,因为不用使用显示的强制类型转换,即不再需要Object类和实际使用 的类之间进行转换。使用泛型,所有的转换都是隐式和自动进行的。因此,泛型扩展了代码的重用能力,并且可以安全,容易的重用代码。
二、实例:
下面定义了两个类一个是泛型类Gen、另一个是泛型类GenDemo,该类使用Gen
// A simple generic class.
// Here, T is a type parameter that
// will be replaced by a real type
// when an object of type Gen is created.
class Gen<T> {
T ob; // declare an object of type T
// Pass the constructor a reference to
// an object of type T.
Gen(T o) {
ob = o;
}
// Return ob.
T getob() {
return ob;
}
// Show type of T.
void showType() {
System.out.println("Type of T is " +
ob.getClass().getName());
}
}
// Demonstrate the generic class.
class GenDemo {
public static void main(String args[]) {
// Create a Gen reference for Integers.
Gen<Integer> iOb;
// Create a Gen<Integer> object and assign its
// reference to iOb. Notice the use of autoboxing
// to encapsulate the value 88 within an Integer object.
iOb = new Gen<Integer>(88);
// Show the type of data used by iOb.
iOb.showType();
// Get the value in iOb. Notice that
// no cast is needed.
int v = iOb.getob();
System.out.println("value: " + v);
System.out.println();
// Create a Gen object for Strings.
Gen<String> strOb = new Gen<String>("Generics Test");
// Show the type of data used by strOb.
strOb.showType();
// Get the value of strOb. Again, notice
// that no cast is needed.
String str = strOb.getob();
System.out.println("value: " + str);
}
}
运行结果:
简要分析:
初次接触可能有点困难,懂了后很简单。
首先,class Gen<T>{
其中,T是参数类型,是实际类型的占位符。因为Gen使用类型参数,所以Gen是泛型类,也称参数化类型。
T getob() {
return ob;
}
因为T是参数化类型,ob也是T类型,所以ob类型和getob()方法返回的类型是兼容的。
showType()通过对class对象调用getName()方法来显示T的类型,getClass是由Object方法定义的,该方法返回一个class对象。
注意:泛型只使用引用类型。
当声名泛型类的实例时,传递过来的参数必须是引用类型,不能使用基本类型,如int 、char是不可以的。所以下面的声名是非法的:
Gen<int> intob=new Gen<int>(53);
如果读到这里,相信你已经明白泛型的基本原理,总之泛型非常重要。在之后我还会更新一些泛型的相关知识,本文纯手打无废话。参考书籍,清华大学出版社《Java8编程参考官方教程》。