泛型 没有引入时: //没有泛型 时,Object 是所有类的父类,所以向上转型 class Generics { private Object obj; public void setObj(Object obj) { this.obj = obj; } public Object getObj() { return this.obj; } } public class Hi { public static void main(String[] args) { Generics gd = new Generics(); gd.setObj(new Integer(5)); Integer in = (Integer)gd.getObj(); System.out.println("设置的数:"+in); gd.setObj(new Float(1.23F)); Float f = (Float)gd.getObj(); System.out.println("设置的数:"+f); } } /* 设置的数:5 设置的数:1.23 */ 如果向下转型则容易报错 泛型的创建 [public] class 类名 <泛型类型标识1[,泛型 类型标识2,...]> { // 定义属性 [访问控制符] 泛型类型标识 变量名; // 定义方法 [访问控制符] 泛型类型标识 方法名(){}; // 定义方法 [访问控制符] 返回值类型 方法名(泛型类型标识 参数名){}; } 一般而言,类型的参数命名为单个大写字母,普通名称如下: E--元素 K--键 N--数字 T--类型 V--值 S,U,V--第二,第三,第四个类型 // 声明泛型 class Generics<T> { private T obj; public void setObj(T obj) { this.obj = obj; } public T getObj() { return obj; } } // 定义泛型对象 类名<泛型类型> 对象名 = new 类名<泛型类型>(); 其中类型为引用类型,不可为基本数据类型 class Generics<T> { private T obj; public void setObj(T obj) { this.obj = obj; } public T getObj() { return this.obj; } } public class Hi { public static void main(String[] args) { // 只能是用引用的 Integer,不能用 int表示 Generics<Integer> gd1 = new Generics<Integer>(); gd1.setObj(new Integer(5)); // 同上转型 Integer in = gd1.getObj(); // 向下转型 System.out.println("设置的数为:"+in); Generics<Float> gd2 = new Generics<Float>(); gd2.setObj(new Float(1.23)); // 同上转型 Float f = gd2.getObj(); // 向下转型 System.out.println("设置的数组为:"+f); } } /* 设置的数为:5 设置的数组为:1.23 */ 泛型类的构造方法与普通的无什么不同 构造方法格式如下: [访问控制符] 类名([泛型类型] 参数列表) { // 构造方法语句 } // 应用 class Generics<T> { private T obj; public Generics(){} public Generics(T obj) { setObj(obj); } public void setObj(T obj) { this.obj = obj; } public T getObj() { return this.obj; } } public class Hi { public static void main(String[] args) { Generics<Integer> gd = new Generics<Integer>(5); int in = gd.getObj(); System.out.println(in); } } //定义泛型类时声明多个类型 class Generics<T,S> { private T obj1; private S obj2; public Generics(){} public Generics(T obj1, S obj2) { setObj1(obj1); setObj2(obj2); } public void setObj1(T obj1) { this.obj1 = obj1; } public void setObj2(S obj2) { this.obj2 = obj2; } public T getObj1() { return this.obj1; } public S getObj2() { return this.obj2; } public void show() { System.out.println("姓名:"+getObj1()+",年龄:"+getObj2()); } } public class Hi { public static void main(String[] args) { Generics<String, Integer> gd = new Generics<String, Integer>("小二", 27); gd.show(); } } //姓名:小二,年龄:27 // ========= //接收任意指定泛型时需要使用通配符 //无界通配符 "?" class Generics<T,S> { private T obj1; private S obj2; public Generics(){} public Generics(T obj1, S obj2) { setObj1(obj1); setObj2(obj2); } public void setObj1(T obj1) { this.obj1 = obj1; } public void setObj2(S obj2) { this.obj2 = obj2; } public T getObj1() { return this.obj1; } public S getObj2() { return this.obj2; } public void show() { System.out.println("姓名:"+getObj1()+",年龄:"+getObj2()); } public String toString() { return "姓名:"+getObj1()+",年龄:"+getObj2(); } } public class Hi { public static void main(String[] args) { Generics<?,?> gd = new Generics<String, Integer>("小二", 27); gd.show(); fun(gd); } public static void fun(Generics<?,?> t) { System.out.println("fun():"+t); } } /* 姓名:小二,年龄:27 fun():姓名:小二,年龄:27 */ 受限泛型 设置类型形参的上限 定义类 <泛型 类型 标识 extends 泛型类型1 & 泛型类型2 ....> 一个类型参数可以用多个限界类型。限界类之间用 "&"分隔开,在多个限界类型中,可以用多个接口, 但只能有一个类。如果类作为限界类型,则必须放在限界列表中的第一个。 // 设置通配符的上限 // 因为是 继承了 Number类,所以只能是数字 class Generics<T extends Number> { private T obj; public void setObj(T obj) { this.obj = obj; } public T getObj() { return this.obj; } public void show(Generics<?> t) { System.out.println("show():"+getObj()); } } public class Hi { public static void main(String[] args) { Generics<Integer> gd1 = new Generics<Integer>(); gd1.setObj(3); gd1.show(gd1); info(gd1); Generics<Double> gd2 = new Generics<Double>(); gd2.setObj(1.234); gd2.show(gd2); info(gd2); } public static void info(Generics<? extends Number> t) { System.out.println("info():"+t.getObj()); } } /* show():3 info():3 show():1.234 info():1.234 */ // ========= //还可以设置下限,使其只能是某种类型或该类型的父类,只需使用 super关键字 <? super 泛型类型> class Generics<T> { private T obj; public Generics(){} public Generics(T obj) { setObj(obj); } public void setObj(T obj) { this.obj = obj; } public T getObj() { return this.obj; } public String toString() { return getObj().toString(); } } public class Hi { public static void main(String[] args) { Generics<Integer> p = new Generics<Integer>(21); info(p); } //可接收 Integer, Number, Object public static void info(Generics<? super Integer> t) { System.out.println("info():"+t); } } // ============= //泛型也可以作为父类或子类,同样也适用于继承 //以泛型 类为父类,当父类为泛型时,该类也必定是泛型 class Generics<T> { private T obj; public Generics(){} public Generics(T obj) { setObj(obj); } public void setObj(T obj) { this.obj = obj; } public T getObj() { return this.obj; } } public class Hi<T> extends Generics<T> { public Hi(){} public Hi(T obj) { super(obj); } public String toString() { return getObj().toString(); } public static void main(String[] args) { Hi<String> p = new Hi<String>("小二"); System.out.println("内容为:"+p); } } // ============= // 子类自身的需求增加泛型类型 class Generics<T> { private T obj; public Generics(){} public Generics(T obj) { setObj(obj); } public void setObj(T obj) { this.obj = obj; } public T getObj() { return this.obj; } } public class Hi<T,S> extends Generics<T> { private S sub; public Hi(){} public Hi(T obj, S sub) { super(obj); setSub(sub); } public void setSub(S sub) { this.sub = sub; } public S getSub() { return this.sub; } public String toString() { return ("姓名:"+getObj().toString()+",年龄:"+getSub()); } public static void main(String[] args) { Hi<String, Integer> p = new Hi<String, Integer>("小二", 27); System.out.println("对象内容:"+p); } } // ========== //以非泛型类为父类,这时不再需要传递参数给父类 class Generics{} public class Hi<T> extends Generics { private T obj; public Hi(){} public Hi(T obj) { setObj(obj); } public void setObj(T obj) { this.obj = obj; } public T getObj() { return this.obj; } public String toString() { return getObj().toString(); } public static void main(String[] args) { Hi<String> p = new Hi<String>("小二"); System.out.println("对象内容:"+p); } } // ============= //泛型 接口,与泛型类差不多 [访问控制符] interface 接口名称 <泛型类型标识> { // code } interface Hi<T> { public T add(); } // ========= interface InterGenerics<T> { public T show(); } class Generics<T> implements InterGenerics<T> { private T obj; public Generics(){} public Generics(T obj) { setObj(obj); } public void setObj(T obj) { this.obj = obj; } public T getObj() { return this.obj; } public T show() { return getObj(); } } public class Hi { public static void main(String[] args) { Generics<Integer> g = new Generics<Integer>(5); System.out.println("对象内容:"+g.show()); } } //============= 子类在实现泛型接口时明确地给出泛型类型 interface InterGenerics<T> { public T show(); } class Generics implements InterGenerics<Integer> { private Integer obj; public Generics(){} public Generics(Integer obj) { setObj(obj); } public void setObj(Integer obj) { this.obj = obj; } public Integer getObj() { return this.obj; } public Integer show() { return this.getObj(); } } public class Hi { public static void main(String[] args) { Generics g = new Generics(5); System.out.println(g.show()); } } // ----------- //泛型方法 格式: [访问控制符] [static|final] <泛型类型标识>返回值类型 方法名([<泛型类型参数>] [参数]) // --------- class Generics { public <T> T show(T t) { return t; } public static <T> T staticShow(T t) { return t; } } // ========== 使用泛型方法 格式1: [对象名|类名.]方法名(实参列表); 格式2: [对象名|类名.]<实际泛型类型>方法名(实参列表); // ------------ class Generics { public <T> T show(T t) { return t; } public static <T> T staticShow(String str, T t) { return t; } } public class Hi { public static void main(String[] args) { Generics gen = new Generics(); System.out.println("格式一:"+gen.show("小二")); System.out.println("格式1:"+Generics.staticShow("小二", 27)); System.out.println("格式2:"+gen.<String>show("小二")); System.out.println("格式3:"+Generics.<Integer>staticShow("99", 98)); } }