现在的位置: 首页 > 综合 > 正文

Java中的泛型介绍

2014年02月01日 ⁄ 综合 ⁄ 共 1120字 ⁄ 字号 评论关闭

1.泛型的定义

   泛型就是允许在定义类,接口时指定类型参数,这个类型参数将在声明变量、创建对象时确定,则不同类型的对象就不会添加到该泛型集合中。也不需进行强制类型转换。

2.泛型的好处

   在没有泛型之前,一旦把一个对象加入到Java容器(集合)中,集合就会忘记对象的类型,把所有的对象都当成Object类型处理,当程序从集合中取出对象后,就需要进行强制类型转换,而这种转换不仅代码臃肿,而且容易引起ClassCastException异常。

3.泛型类派生子类

   1)当创建了带泛型声明的接口、父类之后、可以为该接口创建实现类,或从该父类派生子类,但不能包含类型参数:

   正确方式如下:public class A extends B<String>,B为一泛型接口,或含有泛型参数的类。也可以不指定类型,如下

   public class A extends B;

   2)并未生成真正的泛型类

     如:ArrayLIst<String>和ArrayLIst<Integer>仍是相同的类,系统不会为其生成新的class文件。但不能使用instanceof运算符进行判断。如下:

Collection cs=new Arraylist<String>();
if(cs instanceof List<String>)//将会引起编译错误,instanceof运算符后不能使用泛型类
{}

4.当不确定泛型类的类型实参时,一般使用类型通配符?来代替,使用如下:

public void test(List<?> c)
{
      for(int i=0;i<c.size();i++)
     {
            System.out.println(c.get(i));
     }
}

但不能这样使用:

List<?> c=new ArrayList<String>();
c.add(new Object());

此时List<?>可以理解是任何泛型List的父类。如果我们只想表示某一类泛型List的父类,可使用如下方法:

public abstract class Sharp
{
    public abstract void draw(Canvas c);
}
public class Canvas
{
     public void drawall(List<? extends Sharp> sharps){}//该函数中的参数被限制为Sharp类的子类类型的参数
    
}

也可以在定义含有泛型参数的类时设定类型形参的上限,如下:

public class Apple<T extends Number>

5.泛型方法

   定义:在声明方法时定义一个或多个类型参数,如下:

   修饰符<T,S>返回值类型  方法名(形参列表){方法体}

   static  <T> void fun(T[] a,Collection<T> c)

抱歉!评论已关闭.