泛型的用法

来源:互联网 发布:visio 网络拓扑图 注意 编辑:程序博客网 时间:2024/06/06 20:48

1. 泛型的作用

泛型,是在创建集合对象时就规定其允许保存的元素类型,然后由编译器负责检查所要添加元素的合法性,另外在取用元素时就不必再进行强制性的类型转换处理。即:将原本确定不变的类型参数化。JDK5.0提出了泛型的概念,通过使用泛型写出更为通用的程序代码。

2. 泛型的用法

泛型分为:泛型类、泛型方法、泛型接口。

泛型类:在类名的后面用尖括号括起一个(或多个)类型参数。(注:类型参数的作用域是定义这个类型参数的整个类,但不包括静态成员方法。因为其类型参数不定,无法直接分配储存空间)

泛型方法:在方法的返回类型前面加上一个类型参数T,并有<>括起来。

泛型接口:在借口名之后加上类型参数。

(下面用常用的泛型接口举例说明Comparablej接口和Comparator接口,通过实现借口中的方法来自定义Collections.sort()和Arrays.sort()的排序规则)

3. 泛型应用举例(Comparator和Comparable接口)

1、泛型类、泛型方法的应用实例

package xcu.hl.fanxing;import java.util.List;/** * 1、泛型类的使用 就是在类名后面加上<T> 多个类型参数时用 ,分隔  * 2、泛型方法的使用:只需要在返回值的前面加上一个类型参数<T>  * 3、泛型接口:只需要在接口名字的最后加上一个类型参数< T > 就ok啦 * @author Administrator * @param <T> * @param <V> */public class Man<T , V> {    //静态变量不能使用泛型//  private static T leg;    private  T head;    private T mouth;    private V hand;    public T getHead() {        return head;    }    public void setHead(T head) {        this.head = head;    }    public T getMouth() {        return mouth;    }    public void setMouth(T mouth) {        this.mouth = mouth;    }    public V getHand() {        return hand;    }    public void setHand(V hand) {        this.hand = hand;    }    //泛型方法 的使用    public T getS(List<T> list){        return list.get(0);    }    public static void main(String[] args) {        Man<String ,Integer> m = new Man<String , Integer>();        m.setHand(5);        m.setMouth("Mouth is used to eat !!!");        m.setHead("Head is used to think !!!");        System.out.println(m.getHead()+"\n"+m.getMouth()+"\n Man have five fingers\n"+m.getHand());        //如果在创建对象时没有定义(类型参数)的具体类型,        //使用该类的一些属性是就需要进行强制类型转换了        Man m2 = new Man();        m2.setHand("two Hands");        String st = (String) m2.getHand();        System.out.println(st);    }}

2、Comparator和Comparable接口的应用实例(利用Collections.sort() Arrays.sort()自动排序时使用)

package xcu.hl.fanxing;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;/** * 1、实现comparable接口,重写compareTo()方法来定义对象的比较规则。 * 2、实现Comparator接口,重写compare()方法来定义某个对象比较规则。 * 3、重写两个方法后就可以调用Collections.sort(List<Object>)对相应对象的集合进行排序。 * 4、Arrays.sort(<T extends Number> T []) 就是只能对数组类型的对象进行排序。 * @author java_韩磊 */public class Woman implements Comparable<Woman> {    private int age;    private String name;    public Woman(int age, String name) {        this.name = name;        this.age = age;    }    private String getName() {        return name;    }    private void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    //定义Woman对象的排序规则    //先按照name排序,如果姓名一样的话就用年龄排序。    @Override    public int compareTo(Woman o) {        if(this.getName().compareTo(o.getName())!=0){            return this.getName().compareTo(o.getName());        }else{            return this.getAge()-o.getAge();        }    }    public static void main(String[] args) {        List<Woman> list= new ArrayList<Woman>();        Woman w = new Woman(12,"abc");        Woman w2 = new Woman(31,"bca");        Woman w3 = new Woman(21,"acb");        Woman w4 = new Woman(51,"bac");        Woman w5 = new Woman(21,"bac");        list.add(w);        list.add(w2);        list.add(w3);        list.add(w4);        list.add(w5);        Double [] d = {1.1,0.2,5.5,3.2,1.0};        //自动调用new WomanComparator()的compare()方法进行排序        //只能对数组对象进行排序,不能对集合对象排序(具体的使用方法看API文档)        Arrays.sort(d,new WomanComparator());        System.out.println("Double类型数据从大到小配需后为:");        for(int i=0;i<d.length; i++){            System.out.print(d[i] +" \t");        }        //自动调用重写的compareTo()方法进行排序,针对集合对象进行排序        Collections.sort(list);        System.out.println();        System.out.println("Woman对象数据按照指定规则为woman排序后为:");        for(Woman woman: list){            System.out.print(woman.getAge()+" " +woman.getName()+" \t");        }    }}//继承Comparator接口,重新定义Double类型数据的比较规则。package xcu.hl.fanxing;import java.util.Comparator;public class WomanComparator implements Comparator<Double> {    //重新定义Double类型的排序规则,按照从大到小的规则排序    @Override    public int compare(Double o1, Double o2) {        // TODO Auto-generated method stub        return (int) (o2-o1);    }}

4. 受限的类型参数和类型通配符“ ? ”

  • 将类型参数限制为Number类子类< T extends Number>
  • 类型参数 ? , 表示该类型参数可以匹配任何类型。
  • ? extends Number 上限通配符
  • ? super Number 下限通配符

泛型的难点就是通配符的应用,有兴趣者可以深入研究,这里只是简单介绍泛型的基本用法。

0 0
原创粉丝点击