第12章 泛型( Generics) 泛型入门 泛型进阶语法
第12章 • 泛型(Generics) – 泛型入门 – 泛型进阶语法
泛型之前 public class booleanFoo private Boolean fooi public void setFoo(Boolean foo) this foo =foo; public Boolean getFoo( return foo public class IntegerFoo i private Integer foo public void set Foo(Integer foo ) i this. fo fo public Integer getFoo ( return foo
没有泛型之前 public class BooleanFoo { private Boolean foo; public void setFoo(Boolean foo) { this.foo = foo; } public Boolean getFoo() { return foo; } } public class IntegerFoo { private Integer foo; public void setFoo(Integer foo) { this.foo = foo; } public Integer getFoo() { return foo; } }
没有泛型之前 Object为最上层的父类别,所以用它来实现 泛型( Generics)功能 public class objectFoo private object fooi public void set Foo(object foo) f this. foo foo public objectgetFoo() return foo
没有泛型之前 public class ObjectFoo { private Object foo; public void setFoo(Object foo) { this.foo = foo; } public ObjectgetFoo() { return foo; } } • Object为最上层的父类别,所以用它来实现 泛型(Generics)功能
没有泛型之前 ObjectFoo fool = new objectFoo()i ObjectFoo foo2 new objectFoo( fool. setFoo(new Boolean(true))i //记得转换实现类型 Boolean b =(Boolean) fool. getFoo(i foo2 setFoo (new Integer(10))i //记得转换实现类型 Integer i =(Integer) foo2 getFoo o)i 转换型态时用错了型态 ObjectFoo fool new objectFoo ()i fool. setFoo(new Boolean(true))i String s=(String) fool. getFoo ()i ClassCastException
• 转换型态时用错了型态 没有泛型之前 ObjectFoo foo1 = new ObjectFoo(); ObjectFoo foo2 = new ObjectFoo(); foo1.setFoo(new Boolean(true)); //记得转换实现类型 Boolean b =(Boolean) foo1.getFoo(); foo2.setFoo(new Integer(10)); //记得转换实现类型 Integer i =(Integer) foo2.getFoo(); ObjectFoo foo1 = new ObjectFoo(); foo1.setFoo(new Boolean(true)); String s = (String) foo1.getFoo(); ClassCastException
定义泛型类别 J2SE50之后,针对泛型( Generics)设计 的解决方案 使用用来声明一个型态持有者名称T public class GenericFoo private T fooi public void set Foo(t foo)I this. foo fooi public t getFoo()( return foo
定义泛型类别 • J2SE5.0之后,针对泛型(Generics)设计 的解决方案 • 使用用来声明一个型态持有者名称T public class GenericFoo { private T foo; public void setFoo(T foo) { this.foo = foo; } public T getFoo() { return foo; } }
定义泛型类别 可以使用魚括号一并指定泛型类别型态持 有者T真正的型态 GenericFoo fool= new Generic Fooi GenericFoo foo2= new GenericFoo()i fool. setFoo (new Boolean(true) Boolean b=foo1. getFoo();//不需要再转换型态 System. out. println(b) foo2 setFoo(new Integer(10))i Integer l=foo2. getFoO();/不需要再转换型态 System. out. println(i)i
定义泛型类别 • 可以使用角括号一并指定泛型类别型态持 有者T真正的型态 GenericFoo foo1 = new GenericFoo(); GenericFoo foo2 = new GenericFoo(); foo1.setFoo(new Boolean(true)); Boolean b = foo1.getFoo(); //不需要再转换型态 System.out.println(b); foo2.setFoo(new Integer(10)); Integer i = foo2.getFoo(); //不需要再转换型态 System.out.println(i);
定义泛型类别 型态或接口转换不再需要 省去恼人的 ClassCastEXception发生 编译程序可以帮您作第一层防线 Generic Foo fool= new GenericFoo( fool. setFoo(new Boolean(true))i Integer l=foo1. getFOO();/传回的是 Boolean型态 Generic Foo Demo.java: 7: incompatible types found java lang Boolean required: java. lang. Integer Integer i= fool. getFoo()i
定义泛型类别 • 型态或接口转换不再需要 – 省去恼人的ClassCastException发生 • 编译程序可以帮您作第一层防线 GenericFoo foo1 = new GenericFoo(); foo1.setFoo(new Boolean(true)); Integer i = foo1.getFoo(); //传回的是Boolean型态 GenericFooDemo.java:7: incompatible types found : java.lang.Boolean required: java.lang.Integer Integer i = foo1.getFoo();
定义泛型类别 声明及配置对象时不一并指定型态,默认 会使用 Object型态 GenericFoo foo3= new GenericFoo( foo3 setFoo (new Boolean(false))i 编译时编译程序会提出警讯 Note: GenericFoo Demo java uses unchecked or unsafe operations Note: Recompile with -Xlint: unchecked for details
定义泛型类别 • 声明及配置对象时不一并指定型态,默认 会使用Object型态 • 编译时编译程序会提出警讯 GenericFoo foo3 = new GenericFoo(); foo3.setFoo(new Boolean(false)); Note: GenericFooDemo.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details
定义泛型类别 Generic0o声明的foo1与 GenericFoo声明的foo2是不同的 GenericFoo fool new GenericFoo(i GenericFoo foo2= new GenericFoo( 不可以将foo1所参考的实例指定给foo2,或 是将foo2所参考的实例指定給foo1 incompatible types found: GenericFoo required: GenericFoo fool foo 2
定义泛型类别 • GenericFoo声明的foo1与 GenericFoo声明的foo2是不同的 • 不可以将foo1所参考的实例指定给foo2,或 是将foo2所参考的实例指定給foo1 GenericFoo foo1 = new GenericFoo(); GenericFoo foo2 = new GenericFoo(); incompatible types found : GenericFoo required: GenericFoo foo1 = foo2;
几个定义泛型的例子 类上声明两个类型持有者T1与T2 public class GenericFoo2 private Tl fool private T2 foo2i Generic Foo foo new GenericFoo()i
几个定义泛型的例子 • 类上声明两个类型持有者T1与T2 public class GenericFoo2 { private T1 foo1; private T2 foo2; … } GenericFoo foo = new GenericFoo();