类与方法都可以被范型化。类范型由类名后面跟上一个或几个三角括号包含的类型变量组成。
ArrayList<E> 代表的意思是ArrayList类里存放的数据类型,只能是E类型及其子类,如果不是,编译时会编译不通过。
public E get(int index) 代表的意义是该方法返回的类型是E类型,使用的时候可以直接当做E类型使用。
E是什么类型呢,E可以是任何类型。
例如:只需要存放String类型数据的ArrayList ,可以声明为:
List<String> list = new ArrayList<String>();
package home;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*
* generic 范型的使用
*/
public class GenericTest {
public static void main(String[] args) {
ArrayList<String> array = new ArrayList<String>();
array.add("hello");
//array.add(1); 报错,因为这里已经声明了,array只能存放String,以及其子类类型
for(String a: array){
System.out.println(a);
}
ArrayList<Integer> array2 = new ArrayList<Integer>();
array2.add(1);
array2.add(40);
for(int a: array2){
System.out.println(a);
}
//使用多个范型 Map<String, Date>
Map<String, Date> map = new HashMap<String ,Date>();
map.put("time1", new Date());
map.put("time2", new Date());
map.put("time3", new Date());
for(String key : map.keySet()){
Date date = map.get(key);
System.out.printf("key: %1$s, value :%2$tF %2$sT%n",key ,date);
}
List <Date> datelist = new ArrayList<Date>();
List<Integer> intList = new ArrayList<Integer>();
datelist.add(new Date());
datelist.add(new Date());
intList.add(3);
intList.add(5);
numberList(intList);
dateList(datelist);
}
/*
* 范型通配符
* 通配符的不确定性,通过通配符只能用来进行类型安全检查,而不能用来声明具体的范型
*
* 范型允许使用通配符(?) ,?代表任何数据类型,使用List<?> list ,表示List里可以放任何数据类型,
* ?一般与extends 连用,表示指定类型以及其所有子类
* ?与super连用,表示指定类型以及指定类型的所有父类
*
* List <?> list = new ArrayList<?>(); //编译出错,因为通配符只能用来进行安全检查,这里是作为了声明
* List <? extends Number> list2 = new ArrayList<? extends Number>();
*/
//List <? extends Number> list 用来检查,list里面存放的数据类型必须是Number,以及其子类型
public static void numberList(List <? extends Number> list){
for(Number num: list){
System.out.printf("输出数字:%1$s %n", num);
}
}
public static void dateList(List <? extends Date> list){
for(Date date: list){
System.out.printf("输出日期:%1$tF %1$tT%n", date);
}
}
}