java中的泛型:
泛型是java SE 1.5的新特性,泛型实质上就是使程序员定义的安全类型。
先看看为什么会有泛型出现:在没有泛型的时候,java也提供了对Object的引用的任意话操作,就是对Object进行向下造型和向上造型的操作,但是某些强制类型转换不会被编译期捕捉到,而是在运行后出现异常,可见如此存在隐患,所以提供了泛型机制。
public class AboutGenericity {
private Object b;
public Object getB() {
return b;
}
public void setB(Object b) {
this.b = b;
}
public static void main(String[] args){
AboutGenericity genericity = new AboutGenericity();
//向上造型
genericity.setB(new Boolean(true));
System.out.println(genericity.getB());//输出true
genericity.setB(new Float(11.2));
//向下造型
Float f = (Float)genericity.getB();
System.out.println(f);//输出11.2
//向下造型
Integer i = (Integer)genericity.getB();
System.out.println(i);//报错ClassCastException
}
}
其中向上造型是安全的,但是在向下造型的时候用错了类型,或者是没有执行该操作,就会出现异常,就如上面代码中对Integer的向下造型,可以别编译器接受但是执行出错。而泛型机制有效的解决了这一问题。
泛型类的定义:
语法:类名<T>
public class Genericity<T> {//定义泛型类
private T g;
public T getG() {
return g;
}
public void setG(T g) {
this.g = g;
}
public static void main(String[] args){
Genericity<Boolean> g1 = new Genericity<Boolean>();
Genericity<Float> g2 = new Genericity<Float>();
g1.setG(true);
g2.setG(11.2f);
//不需要转换类型
Boolean b = g1.getG();
//不需要转换类型
Float f = g2.getG();
//Integer i = g2.getG();编译器提示编译错误
System.out.println(b);
System.out.println(f);
}
}
使用泛型定义的类在声明该类对象是可以根据不同的需求指定<T>正真的类型,而在使用类中的方法传递或者返回数据类型时将不再需要根据类型进行类型的转换操作,而是使用在声明泛型类对象时设置的数据类型。
使用泛型这种形式将不会出现ClassCastException异常,因为在编译器中就可以检查类型是否匹配。
具体的一些用法以后有用到在做整理吧.
泛型的好处
Java 语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。
这带来了很多好处:
1,类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
2,消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。