您的位置:首页 > 其它

泛型

2016-05-11 00:00 295 查看
•泛型是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: