没使用泛型前将导致的问题代码:
package en.iteast.generic.demo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.TreeSet;
import en.iteast.generic.domain.Student;
public class GenericDemo9 {
private void mian() {
Collection coll = new ArrayList();
coll.add("lixinting");
coll.add("lidanni");
coll.add("zhudanni");
TreeSet ts = new TreeSet(coll);
ts.add(88);
/**
* 1.
* 这将导致一个问题:
*TreeSet集合中,前3个是字符串,后一个是Integer,这将导致将TreeSet容器中的
* 元素遍历出来会报错。
* 解决:
* 通过设置泛型上限,使得遍历时的范围变广。
*
*/
for (Object object : ts) {
System.out.println(object);
}
}
}
class MyTreeSet{
public MyTreeSet() {
}
public MyTreeSet(Collection c) {
}
}
使用泛型改进后的代码:
package en.iteast.generic.demo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.TreeSet;
import en.iteast.generic.domain.Person;
import en.iteast.generic.domain.Student;
public class GenericDemo10 {
/**
* 泛型上限实操,可见API文档
* java.util.TreeSet类中TreeSet(Collection<? extends E> c)
* 一般往集合中存储元素时,如果集合中定义了E类型,通常情况下应该存储E类型的对象。
* 对于E的子类型的对象E类型也可以接受。所以这时可以将泛型从E改为---<? extends E>--- c。
*/
public static void mian(String[] args) {
Collection<Student> coll = new ArrayList<Student>();
coll.add(new Student(21,"zhang3"));
coll.add(new Student(22,"lki4"));
coll.add(new Student(24,"LiXinTing"));
TreeSet ts = new TreeSet(coll);
ts.add(new Person(21,"zhang3"));
for (Iterator<Person> iterator = ts.iterator(); iterator.hasNext();) {
Person object = iterator.next();
System.out.println(object);
}
}
}
//与TreeSet类似的类设计:
class MyTreeSet<E>{
public MyTreeSet() {
}
public MyTreeSet(Collection<? extends E> c) {
}
}