1 本文对Java泛型进行了全面的总结。文章内容包括普通泛型、通配符、受限泛型、泛型接口、泛型方法、返回泛型类型实例等等。
2 AD: WOT2014课程推荐:实战MSA:用开源软件搭建微服务系统
3 虽然Scala创始人Martin Odersky说当年正是因为Java泛型的丑陋,所以才想到要创建一个新的语言,不过这仍然不妨碍我们学习Java泛型。毕竟即使听说Java泛型不好用,但好不好用还是得会用了才知道。下面是一些有关Java泛型的总结:
4
5 普通泛型
6
7 class Point< T>{ // 此处可以随便写标识符号,T是type的简称
8 private T var ; // var的类型由T指定,即:由外部指定
9 public T getVar(){ // 返回值的类型由外部决定
10 return var ;
11 }
12 public void setVar(T var){ // 设置的类型也由外部决定
13 this.var = var ;
14 }
15 };
16 public class GenericsDemo06{
17 public static void main(String args[]){
18 Point< String> p = new Point< String>() ; // 里面的var类型为String类型
19 p.setVar("it") ; // 设置字符串
20 System.out.println(p.getVar().length()) ; // 取得字符串的长度
21 }
22 };
23 ----------------------------------------------------------
24
25 class Notepad< K,V>{ // 此处指定了两个泛型类型
26 private K key ; // 此变量的类型由外部决定
27 private V value ; // 此变量的类型由外部决定
28 public K getKey(){
29 return this.key ;
30 }
31 public V getValue(){
32 return this.value ;
33 }
34 public void setKey(K key){
35 this.key = key ;
36 }
37 public void setValue(V value){
38 this.value = value ;
39 }
40 };
41 public class GenericsDemo09{
42 public static void main(String args[]){
43 Notepad< String,Integer> t = null ; // 定义两个泛型类型的对象
44 t = new Notepad< String,Integer>() ; // 里面的key为String,value为Integer
45 t.setKey("汤姆") ; // 设置第一个内容
46 t.setValue(20) ; // 设置第二个内容
47 System.out.print("姓名;" + t.getKey()) ; // 取得信息
48 System.out.print(",年龄;" + t.getValue()) ; // 取得信息
49
50 }
51 };
52
53 通配符
54
55 class Info< T>{
56 private T var ; // 定义泛型变量
57 public void setVar(T var){
58 this.var = var ;
59 }
60 public T getVar(){
61 return this.var ;
62 }
63 public String toString(){ // 直接打印
64 return this.var.toString() ;
65 }
66 };
67 public class GenericsDemo14{
68 public static void main(String args[]){
69 Info< String> i = new Info< String>() ; // 使用String为泛型类型
70 i.setVar("it") ; // 设置内容
71 fun(i) ;
72 }
73 public static void fun(Info< ?> temp){ // 可以接收任意的泛型对象
74 System.out.println("内容:" + temp) ;
75 }
76 };
77
78 受限泛型
79
80 class Info< T>{
81 private T var ; // 定义泛型变量
82 public void setVar(T var){
83 this.var = var ;
84 }
85 public T getVar(){
86 return this.var ;
87 }
88 public String toString(){ // 直接打印
89 return this.var.toString() ;
90 }
91 };
92 public class GenericsDemo17{
93 public static void main(String args[]){
94 Info< Integer> i1 = new Info< Integer>() ; // 声明Integer的泛型对象
95 Info< Float> i2 = new Info< Float>() ; // 声明Float的泛型对象
96 i1.setVar(30) ; // 设置整数,自动装箱
97 i2.setVar(30.1f) ; // 设置小数,自动装箱
98 fun(i1) ;
99 fun(i2) ;
100 }
101 public static void fun(Info< ? extends Number> temp){ // 只能接收Number及其Number的子类
102 System.out.print(temp + "、") ;
103 }
104 };
105 ----------------------------------------------------------
106
107
108 class Info< T>{
109 private T var ; // 定义泛型变量
110 public void setVar(T var){
111 this.var = var ;
112 }
113 public T getVar(){
114 return this.var ;
115 }
116 public String toString(){ // 直接打印
117 return this.var.toString() ;
118 }
119 };
120 public class GenericsDemo21{
121 public static void main(String args[]){
122 Info< String> i1 = new Info< String>() ; // 声明String的泛型对象
123 Info< Object> i2 = new Info< Object>() ; // 声明Object的泛型对象
124 i1.setVar("hello") ;
125 i2.setVar(new Object()) ;
126 fun(i1) ;
127 fun(i2) ;
128 }
129 public static void fun(Info< ? super String> temp){ // 只能接收String或Object类型的泛型
130 System.out.print(temp + "、") ;
131 }
132 };
133
134 Java泛型无法向上转型
135
136 class Info< T>{
137 private T var ; // 定义泛型变量
138 public void setVar(T var){
139 this.var = var ;
140 }
141 public T getVar(){
142 return this.var ;
143 }
144 public String toString(){ // 直接打印
145 return this.var.toString() ;
146 }
147 };
148 public class GenericsDemo23{
149 public static void main(String args[]){
150 Info< String> i1 = new Info< String>() ; // 泛型类型为String
151 Info< Object> i2 = null ;
152 i2 = i1 ; //这句会出错 incompatible types
153 }
154 };
155
156 Java泛型接口
157
158 interface Info< T>{ // 在接口上定义泛型
159 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
160 }
161 class InfoImpl< T> implements Info< T>{ // 定义泛型接口的子类
162 private T var ; // 定义属性
163 public InfoImpl(T var){ // 通过构造方法设置属性内容
164 this.setVar(var) ;
165 }
166 public void setVar(T var){
167 this.var = var ;
168 }
169 public T getVar(){
170 return this.var ;
171 }
172 };
173 public class GenericsDemo24{
174 public static void main(String arsg[]){
175 Info< String> i = null; // 声明接口对象
176 i = new InfoImpl< String>("汤姆") ; // 通过子类实例化对象
177 System.out.println("内容:" + i.getVar()) ;
178 }
179 };
180 ----------------------------------------------------------
181
182
183 interface Info< T>{ // 在接口上定义泛型
184 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
185 }
186 class InfoImpl implements Info< String>{ // 定义泛型接口的子类
187 private String var ; // 定义属性
188 public InfoImpl(String var){ // 通过构造方法设置属性内容
189 this.setVar(var) ;
190 }
191 public void setVar(String var){
192 this.var = var ;
193 }
194 public String getVar(){
195 return this.var ;
196 }
197 };
198 public class GenericsDemo25{
199 public static void main(String arsg[]){
200 Info i = null; // 声明接口对象
201 i = new InfoImpl("汤姆") ; // 通过子类实例化对象
202 System.out.println("内容:" + i.getVar()) ;
203 }
204 };
205
206 Java泛型方法
207
208 class Demo{
209 public < T> T fun(T t){ // 可以接收任意类型的数据
210 return t ; // 直接把参数返回
211 }
212 };
213 public class GenericsDemo26{
214 public static void main(String args[]){
215 Demo d = new Demo() ; // 实例化Demo对象
216 String str = d.fun("汤姆") ; // 传递字符串
217 int i = d.fun(30) ; // 传递数字,自动装箱
218 System.out.println(str) ; // 输出内容
219 System.out.println(i) ; // 输出内容
220 }
221 };
222
223 通过泛型方法返回泛型类型实例
224
225 class Info< T extends Number>{ // 指定上限,只能是数字类型
226 private T var ; // 此类型由外部决定
227 public T getVar(){
228 return this.var ;
229 }
230 public void setVar(T var){
231 this.var = var ;
232 }
233 public String toString(){ // 覆写Object类中的toString()方法
234 return this.var.toString() ;
235 }
236 };
237 public class GenericsDemo27{
238 public static void main(String args[]){
239 Info< Integer> i = fun(30) ;
240 System.out.println(i.getVar()) ;
241 }
242 public static < T extends Number> Info< T> fun(T param){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定
243 Info< T> temp = new Info< T>() ; // 根据传入的数据类型实例化Info
244 temp.setVar(param) ; // 将传递的内容设置到Info对象的var属性之中
245 return temp ; // 返回实例化对象
246 }
247 };
248
249 使用泛型统一传入的参数类型
250
251 class Info< T>{ // 指定上限,只能是数字类型
252 private T var ; // 此类型由外部决定
253 public T getVar(){
254 return this.var ;
255 }
256 public void setVar(T var){
257 this.var = var ;
258 }
259 public String toString(){ // 覆写Object类中的toString()方法
260 return this.var.toString() ;
261 }
262 };
263 public class GenericsDemo28{
264 public static void main(String args[]){
265 Info< String> i1 = new Info< String>() ;
266 Info< String> i2 = new Info< String>() ;
267 i1.setVar("HELLO") ; // 设置内容
268 i2.setVar("汤姆") ; // 设置内容
269 add(i1,i2) ;
270 }
271 public static < T> void add(Info< T> i1,Info< T> i2){
272 System.out.println(i1.getVar() + " " + i2.getVar()) ;
273 }
274 };
275
276 Java泛型数组
277
278 public class GenericsDemo30{
279 public static void main(String args[]){
280 Integer i[] = fun1(1,2,3,4,5,6) ; // 返回泛型数组
281 fun2(i) ;
282 }
283 public static < T> T[] fun1(T...arg){ // 接收可变参数
284 return arg ; // 返回泛型数组
285 }
286 public static < T> void fun2(T param[]){ // 输出
287 System.out.print("接收泛型数组:") ;
288 for(T t:param){
289 System.out.print(t + "、") ;
290 }
291 }
292 };
293
294 Java泛型的嵌套设置
295
296 class Info< T,V>{ // 接收两个泛型类型
297 private T var ;
298 private V value ;
299 public Info(T var,V value){
300 this.setVar(var) ;
301 this.setValue(value) ;
302 }
303 public void setVar(T var){
304 this.var = var ;
305 }
306 public void setValue(V value){
307 this.value = value ;
308 }
309 public T getVar(){
310 return this.var ;
311 }
312 public V getValue(){
313 return this.value ;
314 }
315 };
316 class Demo< S>{
317 private S info ;
318 public Demo(S info){
319 this.setInfo(info) ;
320 }
321 public void setInfo(S info){
322 this.info = info ;
323 }
324 public S getInfo(){
325 return this.info ;
326 }
327 };
328 public class GenericsDemo31{
329 public static void main(String args[]){
330 Demo< Info< String,Integer>> d = null ; // 将Info作为Demo的泛型类型
331 Info< String,Integer> i = null ; // Info指定两个泛型类型
332 i = new Info< String,Integer>("汤姆",30) ; // 实例化Info对象
333 d = new Demo< Info< String,Integer>>(i) ; // 在Demo类中设置Info类的对象
334 System.out.println("内容一:" + d.getInfo().getVar()) ;
335 System.out.println("内容二:" + d.getInfo().getValue()) ;
336 }
337 };
转载于http://www.cnblogs.com/dk18stone/p/3738228.html