Java 集合有一个缺点——把一个对象 “丢进” 集合里之后,集合就会 “忘记” 这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了 Object 类型(其运行时类型没变)。集合对元素类型没有任何限制,这样可能引发一些问题。例如,想创建一个只想保存Dog 对象的集合,但程序也可以轻易的将字符串类型数据“丢” 进集合当中。
Dog ououDog=new Dog("欧欧","雪纳瑞"); Dog yayaDog=new Dog("亚亚","拉布拉多"); List list = new ArrayList(); list.add(ououDog); list.add(yayaDog); list.add("李小龙"); list.add("成龙"); for (Object object : list) { Dog dog=(Dog)object; System.out.println(dog.getName()); }
行运上面的代码会发现,List 集合只知道它盛装的是Object,要想得到Dog 对象当中的数据时,只能通过强制类型转换,但是这个 List 集合当中存储的不光有 Dog 对象,还有字符串的数据类型,在输出的时候会发生异常 java.lang.ClassCastException, 那么这么解决这种问题呢?
List<Dog> list = new ArrayList<Dog>(); list.add(ououDog); list.add(yayaDog); //list.add("李小龙"); //这行代码将引起编译错误,因为 list 对象只可以存储 Dog 对象 啊· for (Dog dog : list) { System.out.println(dog.getName()); }
上面程序成功创建了一个特殊的List集合,这个集合当中只能保存 Dog 对象,不能保存其它类型对象。创建这种特殊的集合方法是:在集合接口、类后增加尖括号,尖括号里放一个数据类型或对象,即表明这个接口、集合类只能保存特定类型对象,创建 List 对象的时候,指定 list不是任意的 List,而是一个 Dog 对象类型的 List,写作 List<Dog>。可以称为List是带一个类型参数的泛型接口。在创建ArrayList 对象时也指定了一个类型参数。而且,当遍历的时候也不需要强制转换类型。避免发生异常。