泛型

•泛型是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 }
View Code

使用<?>或是<? 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 }
View Code

 

posted @ 2015-05-14 23:44  淡纷飞菊  阅读(145)  评论(0编辑  收藏  举报