集合之泛型
未使用泛型
以下代码没有使用泛型:
package com.javalearn.generic;
import com.sun.org.apache.bcel.internal.generic.INSTANCEOF;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TestForgeneric {
public static void main(String[] args) {
List myList = new ArrayList();
Animal a = new Animal();
myList.add(a);
Iterator it = myList.iterator();
while (it.hasNext()) {
Object obj = it.next(); //obj无法调用move方法,必须向下转型
if (obj instanceof Animal) {
Animal a2 = (Animal) obj; // 转型
a2.move();
}
}
}
}
class Animal {
public void move() {
System.out.println("动物在动");
}
}
输出结果:
动物在动
使用泛型
下面使用泛型改进上面的代码:
package com.javalearn.generic;
import com.sun.org.apache.bcel.internal.generic.INSTANCEOF;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TestForgeneric {
public static void main(String[] args) {
List<Animal> myList = new ArrayList<Animal>(); // 只能存Animal,new后面的Animal可省略
Animal a = new Animal();
myList.add(a);
Iterator<Animal> it = myList.iterator();
while (it.hasNext()) {
Animal obj = it.next(); // 使用泛型后每次都返回Animal类型
obj.move();
}
}
}
class Animal {
public void move() {
System.out.println("动物在动");
}
}
输出结果:
动物在动
自定义泛型
以下代码使用自定义泛型:
package com.javalearn.diygeneric;
public class TestFordiyGenric {
public static void main(String[] args) {
People<String> p = new People<>(); // String为实际的atype,若定义了泛型但不使用泛型则默认为Object
p.write("一堆字");
}
}
class People<atype> { // atype为自定义泛型,只是一个符号,随便写,一般写E和T
public void write(atype o) { // 规定此方法只能传atype这一种类型的参数
System.out.println("写了:"+o);
}
}
输出结果:
写了:一堆字
增强for循环
有了泛型,便于使用增强for循环遍历集合:
package com.javalearn.foreach;
import java.util.ArrayList;
import java.util.List;
public class TestForEach {
public static void main(String[] args) {
List<String> strList = new ArrayList<>();
strList.add("good");
strList.add("bad");
for (String s:strList) { // 元素:集合
System.out.println(s);
}
}
}
输出结果:
good
bad