public class GsonImpl extends Json { private Gson gson = new Gson(); @Override public String toJson(Object src) { return gson.toJson(src); } @Override public T toObject(String json, Class claxx) { return gson.fromJson(json, claxx); } @Override public T toObject(byte[] bytes, Class claxx) { return gson.fromJson(new String(bytes), claxx); } @Override public List toList(String json, Class claxx) { Type type = new TypeToken >() {}.getType(); List list = gson.fromJson(json, type); return list; }}
class Info { private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } public String toString(){ // 直接打印 return this.var.toString() ; }};public class GenericsDemo14{ public static void main(String args[]){ Info i = new Info () ; // 使用String为泛型类型 i.setVar("MLDN") ; // 设置内容 fun(i) ; } public static void fun(Info temp){ // 可以接收任意的泛型对象 System.out.println("内容:" + temp) ; }};
使用?可以接受任意类型的数据,却无法进行修改,?w为通配符。
受限泛型
class Info { private T var; // 定义泛型变量 public T getVar() { return var; } public void setVar(T var) { this.var = var; } public String toString(){ // 直接打印 return var.toString(); } }public class GenericsDemo17 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Info info1 = new Info (); // 声明Integer的泛型对象 Info info2 = new Info (); // 声明Float的泛型对象 Info info3 = new Info (); info1.setVar(30); // 设置整数,自动装箱 info2.setVar(30.1F); // 设置小数,自动装箱 info3.setVar("俺是字符串,不能被受限的FUN组装"); fun(info1); fun(info2);// fun(info3); //受限了,不能调用这个 } /** * 可以接收任意的泛型对象(// 只能接收Number及其Number的子类) * @param temp */ public static void fun(Info temp){ // 只能接收String或Object类型的泛型 //public static void fun(Info temp){ System.out.println("内容:"+temp); } }
不仅仅在使用过程中,也可以在定义类的时候指定泛型上限:
class Info { // 此处泛型只能是数字类型 private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } public String toString(){ // 直接打印 return this.var.toString() ; }};public class GenericsDemo19{ public static void main(String args[]){ Info i1 = new Info () ; // 声明Integer的泛型对象 }};
如果设置成Stirng类型就会出现错误:
GenericsDemo20.java:15: 类型参数 java.lang.String 不在其限制范围之内 Info i1 = new Info () ; // 声明Integer的泛型对象
String 不是Number的子类,最高不能超过Number的子类。
设置下限
泛型适用于本类以及父类类型上的时候,必须使用泛型下限。
如下只能接受String以及String的父类。最低不能接受Stirng类及其父类以外的类。
class Info { private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } public String toString(){ // 直接打印 return this.var.toString() ; }};public class GenericsDemo21{ public static void main(String args[]){ Info i1 = new Info () ; // 声明String的泛型对象 Info
注意:子类无法使用父类的泛型类型进行接受。
class Info { private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } public String toString(){ // 直接打印 return this.var.toString() ; }};public class GenericsDemo23{ public static void main(String args[]){ Info i1 = new Info () ; // 泛型类型为String Info i2 = null ; i2 = i1 ; }};
就会爆如下错误:
GenericsDemo23.java:17: 不兼容的类型找到: Info 需要: Info i2 = i1 ; ^
泛型接口:
在jdk1.5以后,不仅仅可以声明泛型类,也可以声明泛型接口,泛型接口很类似泛型类:
访问权限 +interface +接口名称 + <泛型标示>{}
泛型接口实现的两种方式
1:
interface Info { // 在接口上定义泛型 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型}class InfoImpl implements Info { // 定义泛型接口的子类 private String var ; // 定义属性 public InfoImpl(String var){ // 通过构造方法设置属性内容 this.setVar(var) ; } public void setVar(String var){ this.var = var ; } public String getVar(){ return this.var ; } }; public class GenericsDemo{ public static void main(String arsg[]){ Info i = null; // 声明接口对象 i = new InfoImpl("soyoungboy") ; // 通过子类实例化对象 System.out.println("内容:" + i.getVar()) ; } };
2:
interface Info { // 在接口上定义泛型 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型}class InfoImpl implements Info { // 定义泛型接口的子类 private T var ; // 定义属性 public InfoImpl(T var){ // 通过构造方法设置属性内容 this.setVar(var) ; } public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; }};public class GenericsDemo{ public static void main(String arsg[]){ Info i = null; // 声明接口对象 i = new InfoImpl ("soyoungboy") ; // 通过子类实例化对象 System.out.println("内容:" + i.getVar()) ; }};
泛型方法:
泛型方法定义:
访问权限 +<泛型标示>+泛型标示 方法名称(泛型标示 参数名称)
class Demo{ public T fun(T t){ // 可以接收任意类型的数据 return t ; // 直接把参数返回 }};public class GenericsDemo{ public static void main(String args[]){ Demo d = new Demo() ; // 实例化Demo对象 String str = d.fun("soyoungboy") ; // 传递字符串 int i = d.fun(30) ; // 传递数字,自动装箱 System.out.println(str) ; // 输出内容 System.out.println(i) ; // 输出内容 }};
通过泛型方法返回泛型类的实例
class Info { // 指定上限,只能是数字类型 private T var ; // 此类型由外部决定 public T getVar(){ return this.var ; } public void setVar(T var){ this.var = var ; } public String toString(){ // 覆写Object类中的toString()方法 return this.var.toString() ; }};public class GenericsDemo27{ public static void main(String args[]){ Info i = fun(30) ; System.out.println(i.getVar()) ; } public static Info fun(T param){ Info temp = new Info () ; // 根据传入的数据类型实例化Info temp.setVar(param) ; // 将传递的内容设置到Info对象的var属性之中 return temp ; // 返回实例化对象 }};
如果同一方法参数使用泛型,应该保证泛型类型一致:
class Info { // 指定上限,只能是数字类型 private T var ; // 此类型由外部决定 public T getVar(){ return this.var ; } public void setVar(T var){ this.var = var ; } public String toString(){ // 覆写Object类中的toString()方法 return this.var.toString() ; }};public class GenericsDemo{ public static void main(String args[]){ Info i1 = new Info () ; Info i2 = new Info () ; i1.setVar(30) ; // 设置内容 i2.setVar("aoyoungboy") ; // 设置内容 add(i1,i2) ; } public static void add(Info i1,Info i2){ System.out.println(i1.getVar() + " " + i2.getVar()) ; }};
public class GenericsDemo{ public static void main(String args[]){ Integer i[] = fun1(1,2,3,4,5,6) ; // 返回泛型数组 fun2(i) ; } public static T[] fun1(T...arg){ // 接收可变参数 return arg ; // 返回泛型数组 } public static void fun2(T param[]){ // 输出 System.out.print("接收泛型数组:") ; for(T t:param){ System.out.print(t + "、") ; } }};
泛型嵌套:
class Info { // 接收两个泛型类型 private T var ; private V value ; public Info(T var,V value){ this.setVar(var) ; this.setValue(value) ; } public void setVar(T var){ this.var = var ; } public void setValue(V value){ this.value = value ; } public T getVar(){ return this.var ; } public V getValue(){ return this.value ; }};class Demo { private S info ; public Demo(S info){ this.setInfo(info) ; } public void setInfo(S info){ this.info = info ; } public S getInfo(){ return this.info ; }};public class GenericsDemo{ public static void main(String args[]){ Demo > d = null ; // 将Info作为Demo的泛型类型 Info i = null ; // Info指定两个泛型类型 i = new Info ("李兴华",30) ; // 实例化Info对象 d = new Demo >(i) ; // 在Demo类中设置Info类的对象 System.out.println("内容一:" + d.getInfo().getVar()) ; System.out.println("内容二:" + d.getInfo().getValue()) ; }};