您的位置:首页 > 其它

泛型的使用——张孝祥老师高新技术

2013-05-07 23:09 309 查看
泛型的使用——张孝祥老师高新技术

Jdk1.5 的集合类希望你在定义集合时,明确表示你要向集合中装哪种类型的数据,无法加入指定类型以为的数据。

泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可。

泛型:其实就是用来限定类型.

泛型的优点:

1.提高了我们程序的使用性.不需要在自己去做强转.

2.将原来在运行阶段处理的问题,放到了编译阶段.

3.提高安全性.

在我们学习过程中,使用泛型最多的就是在集合中。

泛型可以声明在类上,可以声明在方法上,可以声明在接口上。

声明在类上的泛型,在整个类的范围内都可以使用。

声明在方法上的泛型,只能在方法上使用。什么时候在方法上声明泛型?

类上已经声明了泛型,但是在方法上我们不使用类上的泛型,而是自定义的

一个,那么就可以在方法上声明,注意:在方法上声明时,泛型要定义在方法的返回值前面。

泛型中使用通配符的限定

使用?通配符可以引用其它各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

<? extends E> 它是用来限定是E类型或是E的子类型.

<? super E> 只能是E类型或E的父类型.

限定通配符的上边界:

正确:Vector<? extends Number> x = new Vector<Integer>();

错误:Vector<? extends Number> x = new Vector<String>();

限定通配符的下边界:

正确:Vector<? super Number> x = new Vector<Number>();

错误:Vector<? super Number> x = new Vector<Byte>();

1.关于迭代器中使用泛型

集合上定义了泛型,我们在使用迭代器进行迭代操作时,必须给迭代器

也指定泛型,这样,在迭代出来时就不需要进行强制转换。

2.关于泛型的擦除.

泛型只对编译阶段有效,而在运行阶段就失效。

泛型的应用代码实现——Map的遍历

HashMap<String,Integer> hm = new HashMap<String,Integer>();

hm.put("zxx",19);

hm.put("lis",18);

Set<Map.Entry<String,Integer>> mes = hm.entrySet();

for(Map.Entry<String,Integer> me:mes) {

System.out.println(me.getKey()+" "+me.getValue());

}

泛型方法

只有引用类型才能作为泛型方法的实际参数,不能是基本类型

除了在应用泛型时可以使用extends限定符,在定义泛型时也可以使用extends限定符

可以用来指定多个边界,如<V extends Serializable & cloneable> void method(){},必须实现Serializable 和cloneable两个接口

普通方法、构造方法和静态方法中都可以使用泛型。

也可以用类型变量表示异常,称为参数化的异常,可以用于方法的throws列表中,但是不能用于catch子句中。

例:用下面的代码说明对异常如何采用泛型:

private static <T extends Exception> sayHello() throws T

{

try{

}catch(Exception e){

throw (T)e;

}

}

在泛型中可以同时有多个类型参数,在定义它们的尖括号中用逗号分,例如:

public static <K,V> V getValue(K key) { return map.get(key);}

例:自定义泛型方法

public class GenericsUserDefined{

public static void main(String args[])throws Exception{

Integer x = add(3,5);

Number x1 = add(3.5,5);

//可看成float和int都属于Number类型,如果Float x1 = add(3.5,5);出错

Object x2 = add(3,"abc");

//可看成Integer,String都属Object

}

//自定义泛型方法

private static <T>T add(T x,T y)

//定义一个类型<T>,必须在返回值之前或挨着返回值定义

//声名了一个类型T,调用和返回的参数 都为 T

{

return null;

}

}

/*

我们在开发中,如果在类上已经声明了泛型,

但是我们在方法上不使用类上声明的泛型,

我们可以自己在方法上声明泛型。

这个在方法上声明的泛型,只能在方法内使用。

如果声明在方法上,必须声明在方法的返回值前面。

*/

class Demo10

{

public static void main(String[] args)

{

Student<String> s=new Student<String>();

//s.show(new Student());

String msg=s.print(100);

System.out.println(msg);

//System.out.println(s.show(new Object())); //参数必须是String

}

}

//在类上定义泛型

class Student<T> //如果将泛型定义在类上,那么这个泛型可以在整个类内使用.

{

public <A> void show(A a){ //我们这个方法上没有使用类上声明的泛型,而是在方法上自己声明了一个泛型B

System.out.println(a);

}

public static <B> String print(B b){

return "message"+b;

}

}

/*

自定义类,方法,接口可不可以使用泛型.

泛型声明在类上,那么这个泛型可以在整个类内使用.

*/

class Demo9

{

public static void main(String[] args)

{

Student<String> s=new Student<String>();

s.a="hello";

System.out.println(s.print());

}

}

//在类上定义泛型

class Student<T> //如果将泛型定义在类上,那么这个泛型可以在整个类内使用.

{

T a; //泛型做为成员属性

public void show(){

System.out.println(a);

}

public void show(T t){ //泛型作用在方法.

System.out.println(t);

}

public T print(){

return a;

}

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