在集合中使用泛型
ArrayList<Integer> list = new ArrayList<>();//类型推断 list.add(78); list.add(88); list.add(77); list.add(66); //遍历方式一: //for(Integer i : list){ //不需要强转 //System.out.println(i); //} //遍历方式二: Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next());
Map<String,Integer> map = new HashMap<String,Integer>(); map.put("Tom1",34); map.put("Tom2",44); map.put("Tom3",33); map.put("Tom4",32); //添加失败 //map.put(33, "Tom"); Set<Entry<String,Integer>> entrySet = map.entrySet(); Iterator<Entry<String,Integer>> iterator = entrySet.iterator(); while(iterator.hasNext()){ Entry<String,Integer> entry = iterator.next(); System.out.println(entry.getKey() + "--->" + entry.getValue()); }
自定义泛型结构
1.泛型的声明
- interface List 和 class GenTest<K,V> 其中,T,K,V不代表值,而是表示类型。这里使用任意字母都可以。常用T表示,是Type的缩写。 2.泛型的实例化:
- 一定要在类名后面指定类型参数的值(类型)。如:
List<String> strList = new ArrayList<String>(); Iterator<Customer> iterator = customers.iterator();
- T只能是类,不能用基本数据类型填充。但可以使用包装类填充
- 把一个集合中的内容限制为一个特定的数据类型,这就是generics背后的核心思想
- 体会:使用泛型的主要优点是能够在编译时而不是在运行时检测错误。
class GenericTest { public static void main(String[] args) { // 1、使用时:类似于Object,不等同于Object ArrayList list = new ArrayList(); // list.add(new Date());//有风险 list.add("hello"); test(list);// 泛型擦除,编译不会类型检查 // ArrayList<Object> list2 = new ArrayList<Object>(); // test(list2);//一旦指定Object,编译会类型检查,必须按照Object处理 } public static void test(ArrayList<String> list) { String str = ""; for (String s : list) { str += s + ","; } System.out.println("元素:" + str); } }
- 在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态 属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法 中不能使用类的泛型。