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

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


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;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值