黑马程序员技术交流社区
标题:
泛型这里还是有点模糊,求解
[打印本页]
作者:
陈建凡
时间:
2012-3-18 20:06
标题:
泛型这里还是有点模糊,求解
/**
*/
import java.util.*;
class GenericsDemo3
{
public static void main(String [] args)
{
//TreeSet 的构造函数 TreeSet(Comparator<? super E> comparator)
TreeSet<Student> ts=new TreeSet<Student>(new com());
ts.add(new Student("a07") );
ts.add(new Student("a05") );
ts.add(new Student("a06") );
ts.add(new Student("a01") );
ts.add(new Student("a00") );
Iterator<Student> it=ts.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
TreeSet<Worker> tsa=new TreeSet<Worker>(new com());
tsa.add(new Worker("a--07") );
tsa.add(new Worker("a--05") );
tsa.add(new Worker("a--06") );
tsa.add(new Worker("a--01") );
tsa.add(new Worker("a--00") );
Iterator<Worker> ita=tsa.iterator();
while(ita.hasNext())
{
System.out.println(ita.next().getName());
}
}
}
class com implements Comparator<Person>
{
public int compare(Person p1,Person p2)
{
return p1.getName().compareTo(p2.getName());
}
}
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public String toString()
{
return name;
}
}
class Student extends Person
{
Student(String name)
{
super(name);
}
}
class Worker extends Person
{
Worker(String name)
{
super(name);
}
}
复制代码
? Super E : 可以接收E类型或者E的父类型
在比较器上面的定义 class com implements Comparator<Person> 了,就是说这个比较器可以被Person的超类 去使用,但是Person的子类,Student和Worder
可以使用的,有点不明白啊
作者:
段浩亮
时间:
2012-3-18 20:31
class com implements Comparator<Person>这个比较器是这样得来的:
比较Strdent时定义一个class com implements Comparator<Student>,它可以用于Student和Student的父类型的比较
比较Worker时定义一个class com implements Comparator<Worker>,它可以用于Worker和Worker的父类型的比较
当Person以后再出现新的子类时我们还要定义一个新的比较器,那么既然这些比较器都能接受他们的父类型Person,我们就定义一个Person类型的比较器,以后不管Person再有什么新的子类都可以用这个比较器
作者:
张锐
时间:
2012-3-18 21:09
其实是子类还是父类都是用的多态的观点:父类的引用指向子类的对象,调用的时候用父类的公用的方法。所以你看这里传什么参数的时候按照这点就行了。
比如:
TreeSet(Collection<? extends E> c) : 这里是形参指向传入的值,根据多态,形参设置为父类,指向子类的对象。用extend实现
TreeSet(Comparator<? super E> comparator) : 而在这里 要根据Comparator的compare(T o1, T o2)方法判断大小的,所以也是由treeset的元素向Comparator传递实参,所以 Comparator的参数就是传入的父类,也是父类引用指向子类的对象。 用super实现。
作者:
刘基军
时间:
2012-3-18 21:55
1.java.util
类 TreeSet
<E>
2.TreeSet(Comparator
<? super E>
comparator)
是指:当TreeSet的元素类型为E,那么在使用带有参数的构造函数时,所传入的比较器该为:<? super E>类型,即E类型或其父类型。
3.修改上面的com类的代码:
class com implements Comparator<Student> //
{
public int compare(Student p1,Student p2) //
{
return p1.getName().compareTo(p2.getName());
}
}
对代码进行编译时,会在该行:
TreeSet<Worker> tsa=new TreeSet<Worker>(new com());
报错,提示不存在这样的构造方法!这就说明
“必须保证Comparator比较器的类型是TreeSet集合元素的同类或父类”!
作者:
贠(yun)靖
时间:
2012-3-18 23:02
class Comp implements Comparator<Person>
{
public int compare (Person p1,Person p2) 主要是比较器的泛型要用父类的 传参传过来的子类对象 那不就是刚好 父类引用指向子类对象了吗?
比如Person p1 =new Student("abc01"); 这是添加的第一个对象, 把对象看做一个参数传到这
{ 就表现了多态的应用了嘛 所以这里面的法只能调用父类的方法 多态方嘛
return p2.getName().compareTo(p1.getName());
}
}
定义的那两个子类的比较器应该理解没问题吧?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2