一、封装迭代器,实现通配大部分集合容器
加入泛型,同时简单说明使用"?"
占位符(通配符)以及Type:T
两者的不同:
class GenericDemo
{
public static void main(String[] args)
{
ArrayList<Integer> al=new ArrayList<Integer>();
al.add(1);
al.add(3);
al.add(5);
ArrayList<String> al1=new ArrayList<String>();
al1.add("nihao");
al1.add("hello");
al1.add("ohaU");
printColl(al);
printColl(al1);
}
//静态泛型只能使用方法定义,别忘了。
public static <T> void printColl(ArrayList<T> al)
{
Iterator<T> it = al.iterator();
while(it.hasNext())
{
//如果写成'?',这里就无法进行接收以及操作t对象。
T t = it.next();
System.out.println(t);
}
}
}
关于占位符?
主要用于泛型中的限定:上限:? extends Person
和下限:? super Person
。假设当我们只想要操作Person类及其子类时。就没必要定义过大范围的泛型。这时,使用通配符?
很合适。如下:
先定义两个子类:Worker类和Student类和Person类
class Person
{
private String name;
Person(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
class Student extends Person
{
Student(String name)
{
Super(name);
}
}
class Worker extends Person
{
Worker(String name)
{
Super(name);
}
}
主函数:
class GenerDemo
{
public static void main(String[] args)
{
ArrayList<Worker> al=new ArrayList<Worker>();
al.add(new Worker("few"));
al.add(new Worker("fedc"));
al.add(new Worker("fes"));
ArrayList<Student> al1=new ArrayList<Student>();
al1.add(new Student("---nihao"));
al1.add(new Student("---hello"));
al1.add(new Student("---ohaU"));
ArrayList<Person> al2=new ArrayList<Person>();
al2.add(new Person("nihao---"));
al2.add(new Person("hello---"));
al2.add(new Person("ohaU---"));
printColl(al);
printColl(al1);
printColl(al2);
}
//Person及其子类的迭代器函数
public static void printColl(ArrayList<? extends Person> al)
{
Iterator<? extends Person> it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
}
}
小Demo:使用泛型并排序打印
三个类,Worker和Student继承Person(和上面的无变化)
class Person
{
private String name;
Person(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
class Student extends Person
{
Student(String name)
{
super(name);
}
}
class Worker extends Person
{
Worker(String name)
{
super(name);
}
}
加入二者父类型的比较器
class Compare implements Comparator<Person>
{
public int compare(Person p1,Person p2)
{
return p1.getName().compareTo(p2.getName());
}
}
主函数:使用TreeSet集合实现
class GenerDemo
{
public static void main(String[] args)
{
TreeSet<Worker> al=new TreeSet<Worker>(new Compare());
al.add(new Worker("few"));
al.add(new Worker("fedc"));
al.add(new Worker("fes"));
TreeSet<Student> al1=new TreeSet<Student>(new Compare());
al1.add(new Student("---nihao"));
al1.add(new Student("---hello"));
al1.add(new Student("---ohaU"));
//迭代打印
printColl(al);
printColl(al1);
}
//Person及其子类专用迭代器
public static void printColl(TreeSet<? extends Person> ts)
{
Iterator<? extends Person> it = ts.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
}
}
更多知识点:java泛型(一)、泛型的基本介绍和使用