A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 浪无痕-陈文坤 中级黑马   /  2013-8-6 10:25  /  1564 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 浪无痕-陈文坤 于 2013-8-6 13:54 编辑

import java.util.*;
class Person implements Comparable
{
    String name;
    public Person(String name)
    {
        this.name = name;
    }
    public int compareTo(Object obj)
    {        
        if(!(obj instanceof Person))
            return -1;
        Person p = (Person) obj;
        return this.name.compareTo(p.name);
    }
    public String toString()
    {
        return this.name;
    }
}
class Student extends Person
{
    public Student(String name)
    {
        super(name);
    }
}
class StuComparator implements Comparator<Person>//(? super E)
{
    public int compare(Person p1,Person p2)
    {
    }
}
public class Hello
{

public static void main(String[] args)
{
        TreeSet<Student> p = new TreeSet<Student>(new StuComparator());
}
}
红色部分这个所谓的下限(? super E)的E是不是TreeSet<Student>中所指的Student ?谢谢

6 个回复

倒序浏览
<? super E>语法将泛型类限制为所有E的超类(包括E自身)。也就是说,限定为Person及所有Person的父类。不是Student。

回复 使用道具 举报
回复 使用道具 举报
本帖最后由 李政 于 2013-8-6 11:24 编辑

楼主说的没错,TreeSet<Student> p = new TreeSet<Student>(new StuComparator());这句话中E指的就是Student

2楼讲的好像不太对吧

参考下API
public TreeSet(Comparator<? super E> comparator)
回复 使用道具 举报
java.util.TreeSet<E> 代表一个有序的元素为E的树,它其中的一个构造器需要一个Comparator类来比较两个元素,以E为String类时为例,此时的Comparator可以是Comparator<String>,也可以是Comparator<Object>,但Comparator<Integer>就不行,如何表示这样的限制呢?
jdk源代码中是这样的:
public TreeSet(Comparator<? super E> c)
这样就保证了传给构造器的Comparator是可以进行E元素的比较的。
回复 使用道具 举报
李政 发表于 2013-8-6 11:23
楼主说的没错,TreeSet p = new TreeSet(new StuComparator());这句话中E指的就是Student

2楼讲的好像不 ...

谢谢!!!
回复 使用道具 举报
本帖最后由 浪无痕-陈文坤 于 2013-8-6 14:20 编辑
龚首道 发表于 2013-8-6 11:26
java.util.TreeSet 代表一个有序的元素为E的树,它其中的一个构造器需要一个Comparator类来比较两个元素, ...

谢谢,前面发错了,应该指的是Student(这个?super E 是匹配所有E的超类及其本身,?是匹配传进来的数据,Person 匹配这个<? super E>满足,ok,换句话Person是E(Student)的超类,满足条件)不知道对不对,呵呵,个人看法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马