public class Generic <T>{ private T ob; public Generic(T ob){ this.ob=ob; } public T GetOb(){ return ob; } public void setOb(T ob){ this.ob=ob; } public void showType(){ System.out.println("实际类型是:"+ob.getClass().getName()); } public static void main(String[] args) { Generic<Integer>intg=new Generic<Integer>(3); intg.showType(); Generic<String>strg=new Generic<String>("sd"); strg.showType(); //intg=strg;使用泛型可以避免这种错误的语句出现 因为会报错 } }
Java中泛型可以实现参数的任意化,根据实例化类时 尖括号内指定的类型 来改变被实例化的类Generic类中参数的类型。
如果想让定义的泛型类使用指定范围的类型,可以使用extends关键字来进行限制
public class Generic <T extends Integer>{ }
如上,Generic<String>g=new Generic<String>("sds");语句将会报错,因为不是Ineteger类型
如果一个方法的参数是一个不确定类型的参数,那么需要使用通配符<?>来表达即将填入的参数类型不确定,而不是使用<Object>
public void func(Generic <?>generic){ // }
如果参数部分写为Generic <Object>generic 那么Generic参数化类型被明确Object参数化类型,那么填入Integer参数化类型的Generic对象会报错
被通配符限定的类型参数范围,如下:
public void func(Generic <? extends Number>generic){ // }
泛型在使用的时候需要注意以下几点:
1. 泛型类型不能实例化,即不能new T
2. 不能实例化泛型数组,即不能T[] array=new T[2];
不能创建一个类型特定的泛型引用的数组,即不能 Gen<String>[] array=new Gen<String>[2];
但是可以用通配符创建泛型类型的引用数组:Gen<?>[] array=new Gen<?>[2];
3. 不能用类型参数替换将基本类型
4. 异常:不能捕获也不能抛出泛型类的异常对象
5. 不能在静态变量或者静态方法中引用类型参数,即:static T ob;是非法的