一泛型的由来
Java集合有个缺点,把一个对象"丢进"集合里之后,集合就会"忘记"这个对象的数据类型,当再次取出该对象时候,该对象的编译类型就变成了Object类型(其运行时类型没变)
Java集合之所以这样是因为设计者不知道我们使用集合会保存些什么类型的对象,故设计成能保存任何类型.带来了很好的通用性,
但带来了如下问题:
1.集合对元素类型没有任何限制.Dog与Cat都能存进一个集合中,有时候不方便.
2.将对象"丢进"集合中,集合丢失了对象的状态信息,集合只知道它转的是Object对象,因此取出集合元素之后需要进行强制类型转换,这增加了编程复杂度,也可能引发ClassCastException异常
二使用泛型
Java5引入了"参数化类型"的概念,允许程序在创建集合时指定集合元素的类型,如List<String>,表明该List只能保存字符串类型的对象,Java的参数化类型被称为泛型(Generic)
package com.j1803.genericOfUse;
import java.util.ArrayList;
import java.util.List;
public class GenericList {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("book");
list.add("think");
list.add("Java");
//下面编译错误
//list.add(5)
for (String str : list) {
System.out.println(str);
}
}
}
answer:book think Java
list为一个特殊的List集合,它只能存储String对象,不能保存其他类型的对象,List<String>,也可以称为List是带一个参数类型的泛型接口,在本例中泛型参数为String,在创建ArrayList对象时也要指定一个参 数类型
List中的数据在取出时候,也不需要进行强制类型转换,因为list可以"记住"它的所有集合元素都是String类型.
三Java9增强的"菱形"语法
在Java7以前,如果使用带有泛型的接口,类定义变量,那么调用构造器创建对象时构造器的后面也必须带泛型,显得多余,如List<String>list =new ArrayList<String>(),
Map<String,Integer>scores=new HashMap<String,Integer>();
Java7之后可以改写成:
List<String>list=new ArrayList<>(); Map<String,Integer>map=new HashMap<>().这种语法被称为"菱形"语法
代码示例:
package com.j1803.genericOfUse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DiamondTest {
public static void main(String[] args) {
List<String>list=new ArrayList<>();
list.add("Java");
list.add("PhP");
list.add("C++");
Map<String,List<String>>map=new HashMap<>();
map.put("开发语言", list);
System.out.println(map.get("开发语言"));
}
}