简介:
我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。简单来说,就是当我们写一个方法的时候,无法确定入参是什么类型的时候,就可以使用泛型。
泛型使用规则:
- 所有泛型方法声明都有一个类型参数声明部分,该声明在方法返回类型之前。
- 每一个类型声明参数部分都可以声明一个或多个类型
- 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
- 类型参数只能代表引用类型。
有界类型参数:
在某些特定的场合,你需要限制一个传递到一个参数类型的类型种类范围。
要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。
package com.Enumeration; 2 public class Test<T> { 3 private T t; 4 public T getT() { 5 return t; 6 } 7 public void setT(T t) { 8 this.t = t; 9 } 10 public <U extends Number> void print(U u) { 11 System.out.println("T:"+t.getClass().getName()); 12 System.out.println("U:"+u.getClass().getName()); 13 } 14 public static void main(String[] args) { 15 Test<Integer> test = new Test<Integer>(); 16 test.setT(new Integer(10)); 17 test.print("some text"); //这一行回报错:边界不匹配:类型 Test<T> 的通用方法 print(U)不适用于参数(String)。推断类型 String 并不是有界参数 <U 到 Number> 的有效替代项。 18 }
泛型类:
泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分(如上例子所示)。
类型通配符:
类型通配符一般是使用?代替具体的类型参数。例如 List<?> 在逻辑上是List<String>,List<Integer> 等所有List<具体类型实参>的父类。例:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { List<String> str = new ArrayList<String>(); //String 类型 List<Integer> in = new ArrayList<Integer>(); //Integer类型 str.add("富强"); str.add("民主"); str.add("文明"); in.add(0); in.add(1); pring(str); pring(in); } public static void pring(List<?> list){ //类型通配符 Iterator<?> ite=list.iterator(); while(ite.hasNext()){ System.out.println(list.getClass().getName()+":"+ite.next()); } } }
输出结果为:
类型通配符也有限制,和泛型一样,用extends设置上界。
特别注意:
- <? extends T>和<? super T>的区别:前者标识通配符代表的是T类型以及T类型的子类型;后者标识T类型以及T类型的父类。
- 待补充...