•泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可能。
•在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型
泛型定义:
public class GenericFoo<T> { private T foo; public void setFoo(T foo) { this.foo = foo; } public T getFoo() { return foo; } }
在定义泛型类别时,预设可以使用任何的类型来实例化泛型类型中的类型,但是如果想要限制使用泛型类别时,只能用某个特定类型或者是其子类型才能实例化该类型时,可以在定义类型时,使用extends关键字指定这个类型必须是继承某个类,或者实现某个接口。

1 public class WrapperFoo<T> 2 { 3 private GenericFoo3<T> foo; 4 5 public GenericFoo3<T> getFoo() 6 { 7 return foo; 8 } 9 10 public void setFoo(GenericFoo3<T> foo) 11 { 12 this.foo = foo; 13 } 14 15 public static void main(String[] args) 16 { 17 GenericFoo3<Integer> foo = new GenericFoo3<Integer>(); 18 foo.setFoo(new Integer(-10)); 19 20 WrapperFoo<Integer> wrapper = new WrapperFoo<Integer>(); 21 wrapper.setFoo(foo); 22 23 GenericFoo3<Integer> g = wrapper.getFoo(); 24 System.out.println(g.getFoo()); 25 } 26 27 } 28 29 30 class GenericFoo3<T> 31 { 32 private T foo; 33 34 public T getFoo() 35 { 36 return foo; 37 } 38 39 public void setFoo(T foo) 40 { 41 this.foo = foo; 42 } 43 }
使用<?>或是<? extends SomeClass>的声明方式,意味著您只能通过该名称來取得所参考实例的信息,或者是移除某些信息,但不能增加它的信息,因为只知道当中放置的是SomeClass的子类,但不确定是什么类的实例,编译器不让您加入信息,理由是,如果可以加入信息的話,那么您就得記得取回的实例是什么类型,然后转换为原來的类型方可进行操作,这就失去了使用泛型的意义。

1 import java.util.ArrayList; 2 import java.util.LinkedList; 3 import java.util.List; 4 5 public class GenericTest<T> 6 { 7 private T foo; 8 9 public T getFoo() 10 { 11 return foo; 12 } 13 14 public void setFoo(T foo) 15 { 16 this.foo = foo; 17 } 18 19 public static void main(String[] args) 20 { 21 GenericTest<? extends List> ge = null; 22 23 ge = new GenericTest<ArrayList>(); 24 ge = new GenericTest<LinkedList>(); 25 26 //ge = new GenericTest<HashMap>(); 27 28 GenericTest<? super List> ge2 = null; 29 30 ge2 = new GenericTest<Object>(); 31 32 GenericTest<String> ge3 = new GenericTest<String>(); 33 ge3.setFoo("hello world"); 34 35 GenericTest<?> ge4 = ge3; 36 37 System.out.println(ge4.getFoo()); 38 39 ge4.setFoo(null); 40 41 System.out.println(ge4.getFoo()); 42 43 } 44 }