您的位置:首页 > 编程语言 > Java开发

java 泛型小总结

2016-03-25 16:14 344 查看
1、首先来说一下什么是泛型,为什么java要引入泛型

泛型是Java1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。泛型使用最多的地方就是集合。 Java语言引入泛型的好处是安全简单。为什么说是安全简单呢,通过下面的一个小例子说明:

List list = new ArrayList();
list.add("qwe");
list.add(234);
for(int i = 0;i < list.size(); i++){
String str = (String)list.get(i);
System.out.println(str);
}


上面是一个简单的例子,目的就是刻意的突出在未使用泛型的时候会出现的一些错误。我们在编写代码的时候总是希望错误越早出现越好,而上面例子只有在运行的时候才出错,这样如果在实际的开发中的话就需要我们来调试到底是哪里出了错。但是加了泛型就不一样了,在创建集合的时候就定义了集合中参数的类型,就能很好的避免这样的麻烦。

List<String> list = new ArrayList<String>();
list.add("qwe");
list.add(234);  //(1)


如果在创建集合的时候就定义了集合中数据的类型,那么在(1)位置就会报错。这样就及早的发现避免了一些错误。

List<Integer> l = new ArrayList<Integer>();
List<Object> l2 = new ArrayList<Object>();
System.out.println(l.getClass());       //class java.util.ArrayList
System.out.println(l2.getClass());      //class java.util.ArrayList
System.out.println(l.getClass()==l2.getClass());   //true


上面的代码虽然在创建集合的时候用的不同类型的参数,但是在输出他们的class的时候是同一个,这说明jvm在编译的时候并没有把泛型编译进去。
除了原生态的类型外,还有参数化的类型,下表是在effective java (第二版)中的



可以看到可以使用形式参数和通配符进一步提高代码的实用性。

public class Demo {
public static void main(String[] args){
// 实例化泛型类
Point<Integer, Integer> p1 = new Point<Integer, Integer>();
p1.setX(10);
p1.setY(20);
int x = p1.getX();
int y = p1.getY();
System.out.println("This point is:" + x + ", " + y);

Point<Double, String> p2 = new Point<Double, String>();
p2.setX(25.4);
p2.setY("东京180度");
double m = p2.getX();
String n = p2.getY();
System.out.println("This point is:" + m + ", " + n);
}
}
// 定义泛型类
class Point<T1, T2>{
T1 x;
T2 y;
public T1 getX() {
return x;
}
public void setX(T1 x) {
this.x = x;
}
public T2 getY() {
return y;
}
public void setY(T2 y) {
this.y = y;
}
}


注意:

1、如果只指定了<?>,而没有extends,则默认是允许Object及其下的任何Java类了。也就是任意类。

2、通配符泛型不单可以向下限制,如<? extends Collection>,还可以向上限制,如<? super Double>,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。

3、泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。这些都与泛型类中泛型的使用规则类似。



下面是程序得运行结果:

java.lang.String

java.lang.Integer

java.lang.Character

InitClass

java.util.ArrayList
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: