package experiment4.study;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class GenericDemo {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("abc");
coll.add("zjgsu");
coll.add(5);//由于集合没有做任何限定,任何类型都可以给其中存放
Iterator it = coll.iterator();
while (it.hasNext()) {
//需要打印每个字符串的长度,就要把迭代出来的对象转成String类型
String str = (String) it.next();/*在处理第三个元素(是整形数5),不能够转换为String;会引发java.lang.ClassCastException*/
System.out.println(str+":"+str.length());
}
}
}
/*Exception(意外/例外;expectation) in thread "main" java.lang.ClassCastException:
class java.lang.Integer (cannot be cast to class java.lang.String不能转换到类java.lang.String中;cast计算;投射) (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap') at experiment4.study.GenericDemo.main(GenericDemo.java:16)*/
由于集合中什么类型的元
素 都 可 以 存 储 。 导 致 取 出 时 强 转 引 发 运 行 时
ClassCastException。
Collection虽然可以存储各种对象,但实际上通常
Collection只存储同一类型对象。例如都是存储字符串对
象。
泛型:可以在类或方法中预先使用未知的类型。
一般在创建对象时,将未知的类型确定具体的类型。当没
有指定泛型时,默认类型为Object类型。
使用泛型的好处
将运行时期的ClassCastException,转移到了编译时期变成了编译失
败。
避免了类型强转的麻烦。
package experiment4.study;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class GenericDemo2{
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();//集合明确类型为String
coll.add("abc");
coll.add("zjgsu");
//coll.add(5);//当集合明确类型后,存放类型不一致就会编译报错
// 集合已经明确具体存放的元素类型,那么在使用迭代器的时候,
// 迭代器也同样会知道具体遍历元素类型
Iterator it = coll.iterator();//Iterator 不传入<参数>也可行;而如果要指定的话也只能指定为String,和coll里的元素类型相匹配;
Iterator<String> ite=coll.iterator();
while (ite.hasNext()) {
//需要打印每个字符串的长度,就要把迭代出来的对象转成String类型
String str = (String) ite.next();
//当使用Iterator<String>控制元素类型后,就不需要强转了。获取到的元素直接就是String类型
System.out.println(str);
}
}
}