黑马程序员_java06_泛型

来源:互联网 发布:实时荧光定量pcr数据分析 编辑:程序博客网 时间:2024/06/06 04:09

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

泛型也被称为参数化类型,就是在定义类,接口和方法时,规定了创建将要处理的对象类型。泛型更多地体现在集合的应用上,用于表明集合元素的类型限制。

泛型的好处:
1.将运行时期出现的问题ClassCaseException,转移到了编译时期,方便于程序员解决问题。让运行时间减少安全。
2.避免了强制转换的麻烦。

1.定义简单的泛型类

API中有大量的泛型类与泛型接口等。定义泛型只需要在声明类时在类名后使用(E可以是任何其他字母)的形式指定该类是一个泛型类,E称为类型参数,类型参数可以在该类中需要数据类型的都地方使用,如属性声明,方法声明等。在具体使用该类时,E可以使用任何一个具体类型替代。

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

在使用java提供的对象时,什么时候写泛型?

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

import java.util.*;class GenericDemo {    public static void main(String[] args)     {        TreeSet<String> ts=new TreeSet<String>();        ts.add("java01");        ts.add("java02");        ts.add("java03");        ts.add("java04");        Iterator<String> it=ts.iterator();        while (it.hasNext())        {            System.out.println(it.next());        }    }}

集合TreeSet中定义了泛型,TreeSet全部是String类型,若是非String类型的,无法传入。

泛型参数的限定

一个类通过泛型 参数定义,实现了处理对象的普遍性,这是优点,但是也有缺点。前面的泛型类,泛型接口及泛型方法的定义存在一个缺陷,就是由于参数的类型是未知的,只能在运行时确定下来,因此,就限制了泛型类对目标对象的处理能力。因为泛型类只能将其视为Object类型的实例进行处理,无法更有效地使用参数实力本身所能够提供的方法或者属性。通过使用参数类型的边界限定,可以有效地解决这个问题。

1.定义泛型参数的上界

通过使用extends关键字,可以限定泛型参数的类型上界,声明如下:

public class StudentDemo<T ? extends Person>

上面的方法规定了StudentDemo类所能处理的参数类型和Person有继承关系,这样程序中就会这种关系,将T声明的变量视为Person类型,从而利用了Person类型的特征进行工作。另外,extends 关键字所声明的上界即可以是一个类,也就是一个接口。这一点和接口的实现关键字是不同的。

2.定义泛型参数的下界

通过使用个super关键字可以固定泛型参数的类型为某种类型或者其他超类,例如:

List<? super Person> listP=new ArrayList<T>();

当程序希望为一个方法的参数限定类型时,通常可以使用下限通配符。通过JDK提供数组排列方法sort()。

3.通配符
“?”符号声明参数类型可以是任何一个类型,它和参数T的含义是有区别的。T表示一个未知类型,而“?”表示任何一个类型。这种通配符一般有一下三种用法:
(1)单独的 ? ,用于表示任何类型。
(2)?extends type ,表示带有上界。
(3)?super type ,表示带有下界。

import java.util.*;class GenericDemo8 {    public static void main(String[] args)     {        ArrayList<Person> al=new ArrayList<Person>();        al.add(new Person("zhangsan1",3));        al.add(new Person("zhangsan2",3));        al.add(new Person("zhangsan3",3));        printColl(al);    }    public static void printColl(ArrayList <? extends Person> al)    {        Iterator<? extends Person> it=al.iterator();        while (it.hasNext())        {            //System.out.println(it.next().getName());            //System.out.println(it.next().getAge());            Person p=it.next();            System.out.println(p.getName()+"\t"+p.getAge());        }    }}class Person{    private int age;    private String name;    Person(String name,int age)    {        this.name=name;        this.age=age;    }    public void setName(String name)    {        this.name=name;    }    public String getName()    {        return name;    }    public void setAge(int age)    {        this.age=age;    }    public int getAge()    {        return age;    }}class Student extends Person{    Student(String name,int age)    {        super(name,age);    }}
0 0