黑马程序员——JDK5.0新特性(泛型)



------- android培训java培训、期待与您交流! -------


泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制。

使用泛型的好处:

  1. 将运行时期出现的问题ClassCastException,转移到了编译时期,方便于程序员解决问题,让运行时问题减少,安全。

  2. 避免了强制转换的麻烦。

泛型的格式:通过<>来定义要操作的引用数据类型

         ArrayList<参数化类型>list = new ArrayList<参数化类型>();

 

一、泛型的使用通常在集合框架中很常见,只要见到<>就要定义泛型,其实<>就是用来接收类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

 

示例:

import java.util.*;

class GenericDemo

{

    public staticvoid main(String[] args)

    {

        //指定该容器只存储String类型,出现别的类型,编译失败

        ArrayList al = newArrayList();

        al.add("abc01");

        al.add("abc02");

        al.add("abc03");

        //取出时指定迭代器也为String类型

        Iteratorit = al.iterator();

        while(it.hasNext())

        {

            //有了泛型,此处不需要强转。

            String s = it.next();

            System.out.println(s+":"+s.length());

        }

    }

}

 

二、泛型类

1,当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型来完成扩展。

class Utils

{

private QQ q;

         publicvoid setObject(QQ q)

         {

         this.q = q;

}

public QQgetObject()

{

         return q;

}

}

 

2,泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同方法可以操作不用类型,而且类型还不确定,那么可以将泛型定义在方法上。

class Demo

{

         publicvoid show(T t)

{

         System.out.println(“show:”+t);

}

//泛型定义在方法上,放在返回值类型的前面,修饰符的后面。

publicvoid print(Q q)

{

         System.out.println(“print:”+q);

}

//注意:静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,

//可以将泛型定义在方法上

Publicstatic void method(W w)

{

         System.out.println(“method:”+w);

}

}

 

三、泛型定义在接口上

//泛型定义在接口上。

interface Inter

{

    void show(T t);

}

/*

//实现接口时已明确类型

class InterImpl implements Inter

{

    public void show(String t)

    {

        System.out.println("show:"+t);

    }

}

*/

//实现接口时还不明确类型,定义泛型类。

class InterImpl implements Inter

{

    public void show(T t)

    {

        System.out.println("show:"+t);

    }

}

  

? 通配符,也可以理解为占位符

的区别:代表一个具体类型,传入什么类型,就是什么类型。是不明确类型,代表一个占位符

 

四、泛型限定

? extends E:可以接收E类型或者E的子类型上限

? super E:可以接收E类型或者E的符类型下限

 

class  GenericDemo7

{

    public staticvoid main(String[] args)

    {

        ArrayListal = new ArrayList();

        al.add(newPerson("abc.Person.1"));

        al.add(newPerson("abc.Person.2"));

        al.add(newPerson("abc.Person.3"));

        //printColl(al);

 

        ArrayListal1 = new ArrayList();

        al1.add(newStudent("abc.Student.1"));

        al1.add(newStudent("abc.Student.2"));

        al1.add(newStudent("abc.Student.3"));

        printColl(al1);//ArrayListal1 = new ArrayList();error

    }

    //泛型限定此处指能够接受Person类与Person类得子类(泛型限定)

    public staticvoid printColl(ArrayList al)

    {

        Iterator it = al.iterator();

        while(it.hasNext())

        {

            System.out.println(it.next().getName());

        }

    }

}

 

class Person

{

    privateString name;

    Person(Stringname)

    {

        this.name= name;

    }

    public StringgetName()

    {

        returnname;

    }

}

 

class Student extends Person

{

    Student(Stringname)

    {

        super(name);

    }

}



------- android培训java培训、期待与您交流! -------




你可能感兴趣的:(java,黑马程序员,java,泛型)