黑马程序员——泛型1

来源:互联网 发布:知乎 音乐播放器 编辑:程序博客网 时间:2024/05/20 15:57

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



泛型(Generic)


泛型定义:

java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数是实际参数的占位符一样.

泛型能保证大型应用程序的类型安全和良好的维护性;

 

使用泛型的优势:

类型安全,使编译器对泛型定义的类型做判断限制.如保证TreeSet里的元素类型必须一致;消除强制类型的转换,如,使用Comparable比较时每次都需要类型强转;

 泛型的使用

 

泛型类

 

在类声明时通过一个标识符表示类中某个字段的类型或者某个方法的返回值或参数的类型,这样在类声明或实例化的时候只要指定自己需要的类型就ok。

 

声明带泛型的类:

class 类名<泛型类型1,泛型类型2……>{

       泛型类型  变量名;

       泛型类型  方法名(){}

       返回值类型方法名(泛型类型变量名){}

}

使用带泛型的类:

类名<具体类> 对象名 = new 类名<具体类>();

 

类型参数规范:推荐使用规范-常见的泛型,泛型只保存在源文件中,class文件中不存在;也就是说在编译阶段就会丢失,基本数据类型不能作为泛型类型;

K    键,比如映射的键  key的类型

V     值,比如Map的值 value类型

E     元素,比如Set<E>  Element表示元素,元素的类型

T    泛型,Type的意思

 

我的总结:泛型好处:限定添加类型和消除强转转换的麻烦!

 

泛型使用 publicclass Point<Q>{  //声明任意符号的标识符    private Q x;  //变量类型由外部组成    private Q y;       public Q getX() {       return x;    }    public void setX(Q x) {  //类型由外部决定       this.x = x;    }    //..........................} .................main.........{    Point<Double> p = new Point<Double>(); //定义具体类型    p.setX(1.1);    p.setY(2.2);}


 

练习例子

需求:设计一个表示点的类Point,该类有两个字段,一个是横坐标x,一个纵坐标y,要求坐标有3种表达形式(IntegerDoubleString):

 

如果不使用泛型的话可以新建多个类,但是内部方法体只有参数类型不一样,所以用泛型的话更加简单,给定一个占位符,并不明确表示到底是什么类型,在实际运用的时候才确定类型!!

 

很好的例子!

package generic; class Point<T>{       private T t1;    private T t2;    public T getT1() {        return t1;    }    public void setT1(T t1) {        this.t1 = t1;    }    public T getT2() {        return t2;    }    public void setT2(T t2) {        this.t2 = t2;    }} public class GenericDemo {    public static void main(String[] args) {        //String 类型的        Point<String> p = newPoint<String>();        p.setT1("2");        p.setT2("3");        System.out.println(p.getT1());        System.out.println(p.getT2());        //Integer 类型的        Point<Integer> p2= new Point<Integer>();        p2.setT1(23);        p2.setT2(24);        System.out.println(p2.getT1());        System.out.println(p2.getT2());        //Double 类型的        Point<Double> p3 =new Point<Double>();        p3.setT1(23.00);        p3.setT2(24.00);        System.out.println(p3.getT1());        System.out.println(p3.getT2());//============================        Set<String> s = newHashSet<String>();//创建一个容器对象,应该在创建的时候就明确是装什么的           s.add("a");        //s.add(1);//此时就加不进去了,因为已经限制了容器内参数类型!        //此时就能保证集合里元素类型一致,        Set<Integer> treeSet = new  TreeSet<Integer>();        //规定key只能是String,value是Date        Map<String,Date> map = newHashMap<String,Date>();        // V put(K key, V value)        Date v = map.put("", new Date());//和上面定义的类型一样        //V get(Object key)         Date val = map.get("");    }} 运行结果23232423.024.0


这样的话借助泛型一个类就可以表达多个不同类型的参数!

 

要求

消除强制类型的转换,如,使用Comparable比较时每次都需要类型强转;

 

1、没有加上泛型,最初的需要强制类型转换

 

package generic; import java.util.Set;import java.util.TreeSet; class Person implements Comparable{//需要进行排序的类要实现Comparable       private Integer age;    public Person(Integer age) {        super();        this.age = age;    }    @Override    public int compareTo(Object o) {        Person p = (Person)o;//强制类型转换        return this.age.compareTo(p.age);    }    public String toString(){        return this.age.toString();    }} public class GenericDemo2 {    public static void main(String[] args) {        Set set = new TreeSet();        set.add(new Person(15));        set.add(new Person(12));        set.add(new Person(19));        set.add(new Person(53));        set.add(new Person(62));        System.out.println(set);    }}


第二步:加上泛型,不再需要强转(因为类型已经固定了)!

 

package generic; import java.util.Set;import java.util.TreeSet; class Person implements Comparable<Person>{//    private Integer age;    public Person(Integer age) {        super();        this.age = age;    }    @Override        public int compareTo(Person o) {            return this.age.compareTo(o.age);//按照什么排序        }    public String toString(){        return this.age.toString();    }} public class GenericDemo2 {    public static void main(String[] args) {        Set<Person> set = new TreeSet<Person>();        set.add(new Person(15));        set.add(new Person(12));        set.add(new Person(19));        set.add(new Person(53));        set.add(new Person(62));        System.out.println(set);    }} 



0 0