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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘源 于 2012-7-14 10:19 编辑

     这个是毕老师最后一个15天视频。代码太多了,我就不复制了,这个问题我知道很简单,但是本人水平有限搞不定了,特来求组。

class StuComp implements Comparator<? super Student>
{
        public int compare(Student s1,Student s2)
        {
                return s1.getName().compareTo(s2.getName());
        }
}
这个视频讲的就是?super E的关系。关系我是听明白了但是整个代码中没有这个东西<? super E>,然后我就把关于Worker的都屏蔽了。就剩Student的比较器,然后改成上面的那个样子了,然后系统报错了。错误:
GenericDemo8.java:42: 意外的类型
找到: ? super Student
需要: 不带限制范围的类或接口
class StuComp implements Comparator<? super Student>
                                   ^
GenericDemo8.java:7: 找不到符号
符号: 构造函数 TreeSet(StuComp)
位置: 类 java.util.TreeSet<Student>
                TreeSet<Student> ts = new TreeSet<Student>(new StuComp());
希望有才的朋友棒棒忙,把这个程序改成带<? super Student>的样子。
我还是把代码复制出来把:
import java.util.*;
class GenericDemo8
{
        public static void main(String[] args)
        {
               
                TreeSet<Student> ts = new TreeSet<Student>(new StuComp());

                ts.add(new Student("abc03"));
                ts.add(new Student("abc02"));
                ts.add(new Student("abc06"));
                ts.add(new Student("abc01"));
               
                Iterator<Student> it = ts.iterator();

                while(it.hasNext())
                {
                        System.out.println(it.next().getName());
                }
               


                /*
                TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());

                ts1.add(new Worker("wabc--03"));
                ts1.add(new Worker("wabc--02"));
                ts1.add(new Worker("wabc--06"));
                ts1.add(new Worker("wabc--01"));


                Iterator<Worker> it1 = ts1.iterator();

                while(it1.hasNext())
                {
                        System.out.println(it1.next().getName());
                }*/

        }
}


class StuComp implements Comparator<? super Student>//源代码就是<Student>
{
        public int compare(Student s1,Student s2)
        {
                return s1.getName().compareTo(s2.getName());
        }
}
/*
class WorkerComp implements Comparator<Worker>
{
        public int compare(Worker s1,Worker s2)
        {
                return s1.getName().compareTo(s2.getName());
        }
}
*/
/*

class Comp implements Comparator<Person>
{
        public int compare(Person p1,Person p2)
        {
                return p2.getName().compareTo(p1.getName());
        }
}

*/

class Person
{
        private String name;
        Person(String name)
        {
                this.name = name;
        }
        public String getName()
        {
                return name;
        }
        public String toString()
        {
                return "person :"+name;
        }
}

class Student extends Person
{
        Student(String name)
        {
                super(name);
        }

}
/*
class Worker extends Person
{
        Worker(String name)
        {
                super(name);
        }
}
*/

为了方便你们观看,我把其他都变色了。希望你们棒棒忙啊,楼下的一生平安,财源广进。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1

查看全部评分

2 个回复

倒序浏览
你的代码太多,我就不全部复制了.有几个地方要改
修正后的:
class StuComp<T extends Person> implements Comparator<T>
{
        public int compare(T s1,T s2)
        {
                return s1.getName().compareTo(s2.getName());
        }
}
我想你的意图是要让这个比较器对Person的所有子类都可以进行比较吧?
你的代码:class StuComp implements Comparator<? super Student>
{
        public int compare(Student s1,Student s2)
        {
                return s1.getName().compareTo(s2.getName());
        }
}
TreeSet<Student> ts = new TreeSet<Student>(new StuComp<Student>());//调用比较器时,将实际类型Student传入.
1.你原来的泛型是限定为Person的父类,但是你想想,Object是不是Person的父类呢?Object怎么会有Person的getName方法?编译器也意识到这点,所以不让你通过.
2.如果你在泛型类中需要用到传入类型对象的方法时,就不要用通配符?了,而是用一个大写字母表示类型参数.
3.如果泛型需要限定类型,就在类名后面完成这个动作,然后将类型参数传给接口,貌似接口不接收限定类型参数,这点我也要找找资料.
改过以后,我编译了一次,是成功的.
亲,记得给好评哦~{:soso_e112:}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1

查看全部评分

回复 使用道具 举报
谢谢楼上了。明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马