java泛型

来源:互联网 发布:电信软件有哪些 编辑:程序博客网 时间:2024/06/01 09:02

1.java泛型类型

定义方式为:

class A<T>,其中T不能为基本类型,如可以为String,Integer等类型,但是不能为int,char,double等基本类型,下面使用java.uitl.ArrayList实现一个泛型栈。

栈的工作方式为后进先出,对栈的基本操作为入栈,出栈,下面实现一个简单泛型栈类。

其中T可以用任意其他类型代替,也可以由用户自定义的的类代替。

Stack泛型类如下:

import java.util.ArrayList;public class Stack<T>{        private ArrayList<T> list = new ArrayList<T>();        public void push(T a){         list.add(a);    }       public T pop(){        int lastIndex = list.size();        T returnVal = list.get(lastIndex - 1);         list.remove(lastIndex - 1);         return returnVal;    }        public static void main(String[] args){        Stack<String> str = new Stack<String>();        str.push("landong");        str.push("beijing");        System.out.println(str.pop());    }   }
编译并运行上述代码可得到如下输出:

javac -d . Stack.java && java Stack beijing

2.java泛型方法

利用泛型,定义一个泛型方法,用于打印对象信息,且看如下代码:

public class Gen<T>{    public static void main(String[] args){        Person p = new Person("Ana", "male", 12);        Tree t = new Tree(4.3, "Pine", 5);              Gen.<Person>print(p);        Gen.<Tree>print(t);    }       public static <E> void print(E obj){        System.out.println(obj.toString());    }   }class Person{    String name;    String sex;    int age;    public Person(){    }       public Person(String n, String s, int a){         name = n;        sex = s;        age = a;    }           public String toString(){        return "A person with name: " + name + " age: " + age + " sex: " + sex;    }   }class Tree{        double height;    String type;    int age;    public Tree(){    }    public Tree(double h, String t, int a){        height = h;        type = t;        age = a;    }    public String toString(){        return "A tree with heigth: " + height + " type: " + type + " age: " + age;    }}


编译运行上述代码,输出结果如下:

javac -d . Gen.java && java Gen A person with name: Ana age: 12 sex: maleA tree with heigth: 4.3 type: Pine age: 5


3.java泛型使用限制

(1)不能是用泛型类型参数创建实例,即不能使用new T();

(2)不能使用泛型类型参数创建数组,即不能使用 E[] arr = new E[]

(3)不能使用泛型类型创建数组,对下面这个语句

ArrayList<String>[] list = new ArrayList<String>[10]
是不允许的,但是可以通过下面这种方法来规避这个限制

ArrayList<String> list =  (ArrayList<String>[]) new ArrayList[10]
(4)在静态环境下不允许类的参数时泛型类型

如下面的代码是非法的

public class Test<E>    public static void m(E o1){        }                                      //Illegal          public static E o1;           //Illegal     static{         E o2                            //Illegal     }



原创粉丝点击